C语言程序设计报错问题

img

这个地方有下划线,鼠标放上去也会显示错误为啥可以运行而且生成解决方案的时候不会出错。
有没有同志帮忙看一下

引用math.h头文件了没

这是源码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int fun(int n)
{//求n的所有因数和
int sum=1,i;
for(i=2;i<n;i++)if(n%i==0)sum=sum+i;
return sum;
}
int jiecheng(int n)
{//求n的阶乘
int num=1,i;
for(i=2;i<=n;i++)num*=i;
return num;
}

//错误的地方
int Prime(int n)
{//判断n是否为素数
int i=3;
while(i<=sqrt(n))if(n%i++==0)return 0; //sqrt开平方
return 1;
}

void wanquanshu(int n)
{//完全数 恰好等于自身的因子之和的数
int i,count=0;
printf("完全数:\n");
for(i=0;i<=n;i++)
{
if(i==fun(i))
{
printf("%-5d",i);
if(++count%5==0)printf("\n");
}
}
if(count%5!=0)printf("\n");
}
void qinmishu(int n)
{//亲密数 是两个正整数,每个全部因子之和等于对方
int i,temp,count=0;
printf("亲密数:\n");
for (i=0;i<=n;i++)
{
temp=fun(i);
if (temp>i&&i==fun(temp))
{
printf("(%d,%d)",i,temp);
if (++count%5==0)printf("\n");
}
}
if(count%5!=0)printf("\n");
}
void shuixianhuashu(int n)
{//水仙花数 水仙花数是恰好等于自身各位数字立方和的数
int i,m=3,sum,count=0,temp;
printf("水仙花数:\n");
for(i=100;i<=n;i++)
{
if(999<i&&i<10000)m=4;
if(9999<i&&i<100000)m=5;
temp=i;
sum=0;
while(temp)
{
sum+=(int)pow(temp%10,m);//pow x的y次方函数
temp/=10;
}
if(sum==i)
{
printf("%-5d",i);
if(++count%5==0)printf("\n");
}
}
if(count%5!=0)printf("\n");
}
void jiechengheshu(int n)
{//阶乘和数 是恰好等于自身各位数字阶乘的和的数
int i,count=0,temp,sum;
printf("阶乘和数:\n");
for(i=0;i<=n;i++)
{
sum=0;
if(i==0)sum=jiecheng(i);
else
{
temp=i;
while(temp)
{
sum+=jiecheng(temp%10);
temp/=10;
}
}
if(sum==i)
{
printf("%-5d",i);
if(++count%5==0)printf("\n");
}
}
if(count%5!=0)printf("\n");
}
void zishoushu(int n)
{//自守数 是平方后尾部数字是自身的数
int i,count=0,temp,t;
long num;
printf("自守数:\n");
for(i=0;i<=n;i++)
{
num=ii;
t=10;
temp=i/10;
while(temp)
{
t
=10; //放大t10倍
temp/=10; //缩小temp10倍
}
if(num%t==i) //当余数和i相等时,输出i
{
printf("%-5d",i);
if(++count%5==0)printf("\n");
}
}
if(count%5!=0)printf("\n");
}
void luanshengsushu(int n)
{//孪生素数 差2的两个素数
int i,count=0;
printf("孪生素数:\n");
for(i=3;i<=n-2;i+=2)
{
if(Prime(i)&&Prime(i+2))
{
printf("(%d,%d)",i,i+2);
if(++count%5==0)printf("\n"); //每输出5对数字换行
}
}
if(count%5!=0)printf("\n"); //最后一行不为5的整数个时换行
}
int main()
{
int n,a;
srand((unsigned)time(NULL));
n=1+(int)(50000.0*rand()/(RAND_MAX+1.0));
printf("输入n:%d\n",n);
printf("\n1.输出完全数\n2.输出亲密数\n3.输出水仙花数\n4.输出阶乘和数\n5.输出自守数\n6.输出孪生素数\n0.退出\n\n");
for(;;)
{printf("请输入选择:");
scanf("%d",&a);
switch(a)
{
case 0:exit(EXIT_SUCCESS);
case 1:wanquanshu(n);break;
case 2:qinmishu(n);break;
case 3:shuixianhuashu(n);break;
case 4:jiechengheshu(n);break;
case 5:zishoushu(n);break;
case 6:luanshengsushu(n);break;
}
}
return 0;
}

把while那句修改下:while (i <= (int)sqrt(n))