#include <stdio.h>
#include <math.h>
/*本函数是在求两个日期间的素日期个数*/
int leap(int year)
{
if ((year%4==0&&year%100!=0)||year%400==0)
return 1;
else
return 0;
}
/*判断是否闰年*/
int isprime(int x)
{
int i;
for(i=2;x%i!=0;i++)
{
if(i>sqrt(x))
return 1;
else
return 0;
}
}
/*判断是否为素数*/
int MakeDateNum(int year,int month,int day)
{
int x;
x=10000*year+100*month+day;
return (x);
/*把日期转换为八位数字*/
}
int NextDate(int inputdate)
{
int y,m,d;/*定义年月日*/
int a[12]={31,28,31,30,31,30,31,31,30,31,30};/*平年的每月最后一天*/
int b[12]={31,29,31,30,31,30,31,31,30,31,30};/*闰年的每月最后一天*/
y=inputdate/10000;/*输入数字除以10000之后的整数部分即是年*/
m=(inputdate-y*10000)/100;/*得到的整数部分即是月*/
d=inputdate%100;/*余数部分是日*/
if(leap(y)==1)/*闰年时*/
{
if(m!=12&&d==b[m-1])/*闰年非12月时,若日期是一个月的最后一天*/
return MakeDateNum(y,m+1,1);/*八位日期数字的下一天,下个月的第一天*/
else if(m!=12&&d!=b[m-1])/*闰年非12月时,日期非一个月的最后一天*/
return MakeDateNum(y,m,d+1);/*本月的最后一天*/
else if(m==12&&d==31)/*12月31日*/
return MakeDateNum(y+1,1,1);/*第二年1月1日*/
else
return MakeDateNum(y,m,d+1);/*还剩的12月前30天的下一天*/
}
else if(leap(y)==0)/*平年*/
{
if(m!=12&&d==a[m-1]) /*平年非12月时,若日期是一个月的最后一天*/
return MakeDateNum(y,m+1,1);/*八位日期数字的下一天,下个月的第一天*/
else if(m!=12&&d!=a[m-1])/*平年非12月时,日期非一个月的最后一天*/
return MakeDateNum(y,m,d+1);/*本月的下一天*/
else if(m==12&&d==31)/*12.31*/
return MakeDateNum(y+1,1,1);/*来年1月1日*/
else
return MakeDateNum(y,m,d+1);/*12月30日以前的下一天*/
}
}
int main()
{
int y1,m1,d1,y2,m2,d2;
int date1,date2;
int PrimeDateNum=0;/*素日期数*/
scanf("%d %d %d %d %d %d",&y1,&m1,&d1,&y2,&m2,&d2);/*输入六个数字,两组年月日*/
date1=MakeDateNum(y1,m1,d1);/*第一个八位年月日数字*/
date2=MakeDateNum(y2,m2,d2);/*第二个八位年月日数字*/
if(date1>date2)
{
int tmp=date1;
date1=date2;
date2=tmp;
}
/*两个数字排大小,大的在后,小的在前*/
// printf("%d %d",date1,date2);
int tmpdate=NextDate(date1);/*定义“日期的下一天“为一个函数*/
for(;tmpdate<date2;tmpdate=NextDate(tmpdate))/*“日期下一天”如小于第二个数字(那个较大的数字),循环进行到下一天的下一天,直到与较大的数字相等才停止*/
{
if(isprime(tmpdate)==1)/*若“下一天”是素日期,则素日期个数+1*/
{
PrimeDateNum+1;
}
else continue;
}
printf("%d",PrimeDateNum);/*输出两个日期之间的素日期的个数*/
return 0;
}
构建出现以下错误 :
H:\课程\素日期\main.c:92: warning: statement with no effect
H:\课程\素日期\main.c:96: error: 'PrimeDateNum1' undeclared (first use in this function)
H:\课程\素日期\main.c:96: error: (Each undeclared identifier is reported only once
H:\课程\素日期\main.c:96: error: for each function it appears in.)
改了以后。运行不输出素日期数!
函数isprime()的算法有问题,返回值有可能并不是1或0,这样你的if(isprime()==1)失效。你验证以下代码
int isprime(int x)
{
int i;
for(i=2;x%i!=0;i++)
{
if(i>sqrt(x))
return 1;
else
return 0;
}
}
main()
{
int x,c;
scanf("%d",&x);
c=isprime(x);
printf("%d\n",c);
}
不明白?
追答你运行以上代码可以验证你的函数返回值,例如当你的x为7时,函数返回值是0,明显结论是错误的,这时语句if(isprime(实参)==1就失效了
追问算法有问题?
追答。。。。你定义函数int isprime(int x)的目的是判断x是否为素数,当返回值为1时x是素数,返回值为0时x不是素数
事实上,x=8时,函数返回值是4,
x=7时,函数返回值是0,明白了吗?
程序上需要怎么修改呢?
追答#include
#include
int isprime(int x)
{
int i,k,j;
k=sqrt(x);
for(i=2;i=k+1) j=1;
else j=0;
return (j);
}
main()
{
int x,c;
scanf("%d",&x);
c=isprime(x);
printf("%d\n",c);
}
整个大程序还是有错误啊!
追答你写的代码,可读性不是太好,我没细看。但是int类型数据的范围-32768~32776,当year>3时,以下函数中的数据溢出。你把你的设计目标仔细描述一下,我来写个大概。
int MakeDateNum(int year,int month,int day)
{
int x;
x=10000*year+100*month+day;
return (x);
/*把日期转换为八位数字*/
}
菜鸟跪求高手解读c语言错误提示,
提示错误:c(5) : error C2146: syntax error : missing ';' before identifier 'printf',其中before identifier‘printf'的意思是:在printf这句之前的语句少了一个‘;’,这是有英文提示的!c(6)表示第六句无法执行,你可以双击c(6) : error C2143: syntax error : missing ';' 在代码中...
C语言菜鸟 求解 下面这个程序哪里错了 怎样改
该程序的功能应该是将一个大于2的偶数分解成两个素数之和,所以输入的必须是偶数。两点错误如yang_jnu所说。int isprime(int n);后面多余分号,两个等号之间多空格。再有,main函数中的for(i=3;i<n\/2;i++)应改为for(i=2;i<=n\/2;i++)。源程序如下:include"stdio.h"include"math.h"int...
c语言警告错误怎么修改
在C语言编程中,遇到错误时应仔细分析错误信息,并定位错误的具体位置。若为编译错误,按照IDE提示,找出问题所在,如忘记添加分号等简单语法错误,根据提示进行修改即可。如果是运行时错误,需查看控制台日志,通过日志定位错误源头。例如,若除数为零,程序将报错,需回到源代码,检查并修正对应错误部分,重...
菜鸟跪求下面c语言程序不能运行的原因?
问题比较多,最重要的问题就是格式太乱了,我改了一下:include<stdio.h> include<string.h> struct stu { long no;char name[5];int age;int score;};struct stu s[5]; \/\/此处原,变量名称错了,与下面的s[]不一致 void input(); \/\/函数定义最好放到Main之前 void output();int...
编程菜鸟,这段代码有错?教材上是这样的啊编译器不停报错,根本停不下来...
int a,b,c声明了三个整形变量,但是结尾没有分号;,这是肯定要报错的。然后你打印了一段话在dos屏幕上,(这是第一个程序计算器\\n),还换行输出,这段没有什么问题。printf("请输入第一个数字:");scanf("%d,&a");printf("请输入第二个数字:");scanf("%d,&b");这些都没有问题,...
菜鸟在C语言运行时遇到问题。。。
弄成 拼音后字母组合 ,让人能看懂就成了!随便你怎么 弄。但要是字母!那就真的没有办法了!win-tc你用这个应该可以支持中文的。用这个试试看呢!
C语言菜鸟有问!!(我写完这样一段代码运行后就出现这个错误提示求大神...
当i=9时,d=i+1=10,程序将访问到a[10],内存越界了。
本人初学c,最近编了一个求物理量的小程序,但是每次运行都报错。望指教...
int main(void){ char e;float z;float x;float y;float f;printf("在本程序中,Q代表吸收或放出的热量;\\nc表示比热容;\\nT表示下降或上升的温度;\\n请注意区分大小写;\\n");printf ("请输入要求的量: ");scanf("%c",&e);printf ("请输入已知量,按字母顺序: ");scanf("%f%f%f"...
c语言编程过程中正确的程序报错,是什么spawning.我电脑的系统昨天重装...
C:\\Program Files\\Microsoft Visual Studio\\VC98\\CRT\\SRC 如果你装在其他盘里,则仿照其路径变通就行(我就是装在D盘)。关键是microsoft visual studio\\ 后面的东西要相同。本人深受其害,重装多次不管用,上面中文部分为高手借鉴,参考资料:http:\/\/zhidao.baidu.com\/question\/20787147.html ...
C语言程序受“Error spawning cl.exe”困扰,不能运行!寻好心人帮忙!
最简便的方法:启动VC时不要用图形界面,通过在命令提示符下输入:Msdev \/useenv运行(注意啦\/前面有个空格).它会强制使系统环境变量全高设置成正确值.而且,只需要使用一次这样的方式运行VC,以后再次通过双击图标的方式启动也不会有问题.