HJ55. 挑7
描述
输入描述
一个正整数 n 。( n 不大于 30000 )
输出描述
一个整数,表示1到n之间的与7有关的数字个数。
示例1
输入:
20
输出:
3
说明:
输入20,1到20之间有关的数字包括7,14,17共3个。C 解法, 执行用时: 1ms, 内存消耗: 356KB, 提交时间: 2020-12-05
#include <stdio.h> int main(void) { char flag, mul; int i, j, k, p, scale, num, opt[50], n, arr[50], idx, cnt; n = idx = 0; for( ; scanf("%d", &num)!=EOF; n+=2){ if(num<7) { opt[n]=0; opt[n+1]=0; continue; } opt[n] = num; for(i=idx-1; i>=0; i--) if(i>=0 && arr[i]<=num) break; if(i>=0 && arr[i]==num) continue; for(j=idx-1; j>i; j--) arr[j+1] = arr[j]; arr[j+1] = num; idx++; } cnt = 0; j = 7; for(i=0; i<idx; i++){ num = arr[i]; if(k=j%7){ for(--j; k; --k ,--j){ if(j%7==0) { cnt--; continue; } for(p=j; p; p/=10) if(p%10==7) { cnt--; break; } } ++j; } for(k=j, mul=0; k; k/=10, mul++) if(k%10==7) break; if(k && mul){ for(p=0, scale=1; p<mul; p++) k*=10, scale*=10; cnt -= j-k; } flag=0; for( ; j<=num; j+=7){ for(k=j, mul=0; k; k/=10, mul++) if(k%10==7) break; if(k){ if(!mul) { cnt++; flag=0; continue; } for(p=0, scale=1; p<mul; p++) k*=10, scale*=10; if(num<k+scale) { cnt += num-k+1+flag; j=num+1; goto output; } else { cnt += scale+flag; for(j=k+scale; j<=num; j++){ if(j%7==0) break; for(k=j; k; k/=10) if(k%10==7) { cnt++; break; } } if(j<=num) { j-=7; flag=0; continue; } goto output; } } cnt += flag+1; if(j%10<7) flag=1; else flag=0; } j-=6; for( ; j<=num; j++){ if(j%7==0) { cnt++; continue; } for(k=j; k; k/=10) if(k%10==7) { cnt++; break; } } output: for(k=0; k<n; k+=2) if(opt[k]==num) opt[k+1]=cnt; } for(k=1; k<n; k+=2) printf("%d\n", opt[k]); return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-12-13
#include<stdio.h> int main(){ int n = 0; while(scanf("%d", &n) != EOF){ int res = 0; int tmp = 0; for(int i = 7; i <= n; i++){ if(i%7 == 0)//7的倍数 res ++; else{//包含7 tmp = i; while(tmp > 0){ if(tmp%10 == 7){ res++; break; }else tmp /= 10; } } } printf("%d\n", res); } return 0; }