但是要是考虑N是很大的数 这个方法就太笨了,下面是一个同学给找的程序,vc运行不出结果,找不出来错误啊,大神帮下看下吧。
#include "stdio.h"
#include "math.h"
int found7(int x)
{ /*查找x的每个数位,确认是否包含数字7,函数返回发现7的地方,0表示没有,1表示7在个位,2表示在十位,以此类推*/
int find,l,digit;
int y;
find=false;
l=0;
y=x;
if ((y<10)&&(y==7))
{
find=true;
l++;
return (l);
}
while((y>=10)&&(find==false))
{ /*由个位开始查找输入的x值是否含有数字7,y为x在计算中的中间变量*/
digit=y%10; /*求当前y值的个位上的数值,即y整除10取其余数*/
l++; /*L代表当前正在计算x的数位是个位还是十位,1代表各位,2代表十位,以此类推*/
if (digit==7)
{ /*若发现7,退出循环while*/
find=true;
break;
}/*if*/
y=y/10; /*若没发现7,继续往高位计算*/
if ((y<10)&&(y==7))
{ /*当y<10的时候,不足以继续整除10求余数,则直接比对是否与7相等,相等则找到*/
find=true;
l++;
return (l);
}
}/*while*/
/*根据是否找到7来返回7相对应的数位*/
if (find)
return (l);
else
return (0);
}/*found7()*/
main()
{
int y0,y1,y2,y3,y_temp;
int h,j,s,max_n,input_N;
int key,n,input_ERROR;
int d1,d2,d3;
char c;
input_ERROR=false;
while (input_ERROR)
{
printf("please input the value of N,N=");
scanf("%d",&input_N);
printf("\n");
{
if (input_N<7) printf("\nERROR! N<7, Question no ANSWER!\n");
printf("Do you want to run the program again?(Y/N):");
c=getchar();
while (c!='Y'&&c!='y'&&c!='n'&&c!='N')
{
printf("\nERROR! Wrong input!\n\n");
printf("Do you want to run the program again?(Y/N):");
c=getchar();
}/*while*/
if (c=='n'||c=='N')
return 0;
else
input_ERROR=false;
}
s=1;
h=1;
j=0;
y0=0;
y1=0;
y2=0;
y3=0;
d1=1;
d2=1;
d3=1;
while(y0<=input_N)
{
if(d3)
{ /*y3数列的等式原形为,y3=s*10+n,其中s和n属于正整数,且n∈[0,10^k-1] */
y3=s*10;
while(!found7(y3))
{ /*求仅当y3的十位以上含有7的数*/
s++;
y3=s*10;
}/*while y3*/
}
if(d1)
{ /*y1数列为7的倍数*/
y1=7*h;
while(found7(y1)>0)
{ /*求仅当y1任何数位均不含7的数*/
h++;
y1=7*h;
}/*while y1*/
}
if(d2)
{ /*y2数列为末位为7的数*/
y2=10*j+7;
y_temp=y2-7;
while(found7(y_temp)>0)
{ /*求y2的十位及以上均不含7的数*/
j++;
y_temp=10*j;
y2=10*j+7;
}/*while y2*/
}
/* find the min value from y[1],y[2],y[3] */
/*求y1,y2,y3中的最小值,由上求y1,y2,y3的条件得出,y1,y2,y3互不相等*/
key=0;
if ((y1<y2)&&(y1<y3))
{ /*y1确认为最小值,优先输出*/
y0=y1; /*y0为最后数列输出的控制值*/
key=1; /*后面输出选项控制开关值*/
h++; /*计算y1值的下个初始参数值*/
d1=1; /*d1,d2,d2为重新计算y1,y2,y3的开关值,没有输出的值不必更新,以下说明相同*/
d2=0;
d3=0;
}
if ((y2<y1)&&(y2<y3))
{ /*y2确认为最小值,优先输出*/
y0=y2;
key=2;
j++;
d1=0;
d2=1;
d3=0;
}
if ((y1>y3)&&(y2>y3))
{ /*y3确认为最小值,优先输出*/
y0=y3;
key=3;
d1=0;
d2=0;
d3=1;
}
switch (key)
{
case 1:
if (y0<=input_N) printf("%d\t",y0); /*当y0符合输入条件的范围时,输出到屏幕,原题目要求是每行输出1个数字,本程序为了容易检查,采取横向输出,若按题目可将\t改为\n */
break;
case 2:
max_n=pow(10,found7(y0)-1); /*y3=10*s+n,n∈[0,max_n-1],10*s数值中找第found7(y0)位为7,根据前面返回的说明,个位返回为1,十位返回为2,以此类推,则有10的found7(y0)-1次方为上限的元素个数,即7在十位,返回2,应有n∈[1-10),即n∈[1-10^(2-1))*/
for (n=0;n<max_n;n++)
if ((y0+n)<=input_N)
printf("%d\t",y0+n); /*在题目要求的范围内输出y0值*/
else
return 0; /*若已超过题目范围则直接退出程序的运行*/
c=getchar(); /*此处为程序暂停处,方便检查核对答案,可以注释掉*/
if (y3<=(y0+max_n-1))
{ /*当输出一连串数值后,若y3=10*s远小于最后的输出值,则增大s的值直到y3刚好大于最后的输出值,以下相同*/
while(y3<=(y0+max_n-1))
{
s++;
y3=10*s;
}
}
if (y1<=(y0+max_n-1))
{ /*当输出一连串数值后,若y1=7*h远小于最后的输出值,则增大h的值直到y1刚好大于最后的输出值*/
while(y1<=(y0+max_n-1))
{
h++;
y1=7*h;
}
}
if (y2<=(y0+max_n-1))
{ /*当输出一连串数值后,若y2=10*j+7远小于最后的输出值,则增大j的值直到y2刚好大于最后的输出值*/
while(y2<=(y0+max_n-1))
{
j++;
y2=10*j+7;
}
}
break;
}
}
}