列表

详情


HJ55. 挑7

描述

输出 1到n之间 的与 7 有关数字的个数。
一个数与7有关是指这个数是 7 的倍数,或者是包含 7 的数字(如 17 ,27 ,37 ... 70 ,71 ,72 ,73...)

数据范围:

输入描述

一个正整数 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;
}

上一题