写一个函数f(N),返回1到N之间出现的“1”的个数,比如f(12)=5。
源代码
:
#include <stdio.h>
int f(int n)
{
int i,_i,_n;
int count=0;
for(i=1;i<=n;i++)
{
_n=i;
while(_n!=0)
{
_i=_n%10;
_n=_n/10;
if(_i==1) count++;
}
}
return count;
}
main()
{
int n,count;
printf("Please input N here:");
scanf("%d",&n);
count=f(n);
printf("From 1 to %d ,there are %d ./n",n,count);
}
优化后的代码1
#include<stdio.h>
long myfun(long n)
{
int prior;
int i=1;
long nTemp=n,count=0;
while(0!=n)
{
prior=n%10;
n=n/10;
if(prior>1) count+=(n+1)*i;
else if(1==prior) count+=n*i+(nTemp%i)+1;
else count+=n*i;
i*=10;
}
return count;
}
main()
{
long n;
printf("请输入N:");
scanf("%ld",&n);
printf("从 1 到 %ld 出现 1 的次数为: %ld/n",n,myfun(n));
}
扩展#include<stdio.h>
#include<math.h>
long myfun1(long n,int x)
{
long count=0;
long n1=n;
int i=1,a;
while(n!=0)
{
a=n%10;
if(a>x)
count += (long)pow(10,i-1)+a*(i-1)*(long)pow(10,i-2);
else if(a==x)
count += a*(i-1)*(long)pow(10,i-2)+1+n1%(long)pow(10,i-1);
else
count += a*(i-1)*(long)pow(10,i-2);
n=n/10;
i++;
}
return count;
}
#include<math.h>
long myfun1(long n,int x)
{
long count=0;
long n1=n;
int i=1,a;
while(n!=0)
{
a=n%10;
if(a>x)
count += (long)pow(10,i-1)+a*(i-1)*(long)pow(10,i-2);
else if(a==x)
count += a*(i-1)*(long)pow(10,i-2)+1+n1%(long)pow(10,i-1);
else
count += a*(i-1)*(long)pow(10,i-2);
n=n/10;
i++;
}
return count;
}
main()
{
long n,count;
int x;
printf("请输入N:");
scanf("%ld",&n);
printf("请输入要查询的数X(1-9):");
scanf("%d",&x);
count=myfun1(n,x);
printf("从1到%ld出现%d的次数为:%ld/n",n,x,count);
{
long n,count;
int x;
printf("请输入N:");
scanf("%ld",&n);
printf("请输入要查询的数X(1-9):");
scanf("%d",&x);
count=myfun1(n,x);
printf("从1到%ld出现%d的次数为:%ld/n",n,x,count);
}