题目:(c++)N为正整数,计算从1到N的所有整数中包含数字1的个数。 求大神看看程序哪里错了!

#include<iostream>
using namespace std;
int main()
{
int n,temp,cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
while(i)
{
temp=i%10;
if(temp==1) cnt++;
cout<<cnt;
i/=10;
}
}
cout<<"出现1的次数为:"<<cnt;
return 0;
}

关于i的循环,又出现了i/=10,因此陷入了死循环。

可另设正整数k,令k=i

#include<iostream>
using namespace std;
int main()
{
int n,k,temp,cnt=0;
cin>>n;
for(int i=1;i<=n;i++)
{
k=i;
while(k)
{
temp=k%10;
if(temp==1) 
cnt++;   
cout<<cnt;   
k/=10;  
}
}
cout<<"出现1的次数为:"<<cnt;
return 0;
}

追问

为什么会出现死循环?
i最后=0时循环不是会跳出吗

追答

你的for循环是对i进行循环,循环后i加1
但是在循环中,又改变了i的值。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-02-02
更改后的程序,自己对照这找问题
#include<iostream>
using namespace std;
int main()
{
int n,temp=0,cnt=0,res;
cin>>n;
for(int i=1;i<=n;i++)
{
temp=i;
while(temp>0)
{
res=temp%10;
if(res==1) cnt++;
temp=temp/10;
}
}
cout<<"出现1的次数为:"<<cnt;
return 0;
}
另外,其实这个算法的复杂度太高了,接近O(n2),有更优的算法