初学者请教 两道简单的c语言编程题目

1.分别用for语句和while语句编写一程序:
判断输入的一个16进制数(取值范围:0x0000-0xffff)其2进制表示中所包含的"1"的个数。

2.编写一程序,输入当前日期和你的生日,计算期间的天数(提示:使用循环从出生的下一年开始直到去年,计算期间天数,然后加上头尾两年的剩余天数,注意要考虑闰年)(注意是两种访法)

我们刚学完c的基本数据类型 以及三种程序设计结构,没有涉及到数组等概念,可能第二题需要用到数组。
我做了一下第二题,如下不知是否正确:
#include <stdio.h>

void main()
{
int leap_a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int N_leap_a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int Y1,M1,D1,Y2,M2,D2;
int leap_year=0;
long int total,rest=0;
long int day1=0,day2=0,D1_1=0,i,tatal=0;
int ddd;

printf("\t*********你的生命渡过了多少个日子?*********\n");

printf("请输入您的出生年份:\t\n");
scanf("%d",&Y1);

printf("请输入您的出生月份:\t\n");
scanf("%d",&M1);

printf("请输入您的出生日号:\t\n");
scanf("%d",&D1);

printf("请输入当前年份:\t\n");
scanf("%d",&Y2);

printf("请输入当前月份:\t\n");
scanf("%d",&M2);

printf("请输入当前日号:\t\n");
scanf("%d",&D2);

ddd=Y1;
/////////////////////////////////////////////
if (Y1%4==0&&Y1%100!=0||Y1%400==0)
{
D1_1=leap_a[M1]-D1;
for(i=M1+1;i<13;i++)
{
day1=day1+leap_a[i];
}
}
else
{
D1_1=N_leap_a[M1]-D1;
for(i=M1+1;i<13;i++)
{
day1=day1+N_leap_a[i];
}
}
///////////////////////////////////////////
if (Y2%4==0&&Y2%100!=0||Y2%400==0)
{
for(i=1;i<M2;i++)
{
day2=day2+leap_a[i];
}
}
else
{
for(i=1;i<M2;i++)
{

day2=day2+N_leap_a[i];
}
}
/////////////////////////////////////////////
while (Y1 < Y2) //判断从 Y1 到 Y2 年间有多少个闰年
{
Y1=Y1+1;
if (Y1%4==0&&Y1%100!=0||Y1%400==0)
leap_year++;
}

//********************以下计算年份********************
if(Y2-ddd!=1)
rest=365*(Y2-ddd);

total=rest+leap_year+day1+day2+D1_1+D2;
if(Y2==ddd)
total=total-365; ///在这里可能出现差错
printf("Total Day %d\n",total);
}
第一题的答案,二楼已经给出了,谢谢!不知道第二题有没有什么更精简的做法?期待高手给出啊!如果
int flog;
flog=Y1%4==0&&Y1%100!=0||Y1%400==0;
代替,可是程序简化
我只想得到这个。
现在我再加50分,能有更精简的算法就更好了,我自己也会再考虑的,如果没有的话,分数就给二楼了,谢谢!

[回答]
1. 用C语言自己的时间函数
difftime(time_t time1, time_t time0) / 86400
这样做得缺点是,这里的time_t类型,只支持到2037年

2. 自己定义函数
楼主用的方法,在实际编程里不常用,变化比较大。
下面这个方法是直接计算两个日期到公元元年的天数
然后相减,这个是实际编程时的算法,经过很多程序员的洗炼,已经被广泛使用

#include<stdio.h>
#define LEAP(y) (y%(y%100?4:400)==0) /*公元y年是否闰年*/
long totaldays(int year,int month,int day)/*公元纪年的总天数*/
{ int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int c=day,m,y=year-1;
days[2]=28+LEAP(year);
for(m=1;m<month;m++)c+=days[m];
return c+y/4-y/100+y/400+y*365L;
}
void main()
{ int y,m,d; long t1,t2;
printf("date 1: ");
scanf("%d%*c%d%*c%d",&y,&m,&d);
t1=totaldays(y,m,d);
printf("date 2: ");
scanf("%d%*c%d%*c%d",&y,&m,&d);
t2=totaldays(y,m,d);
printf("total days: %ld\n",t2-t1);
}

这应该是全部的实现方法了
楼主的方法没必要简化了
尤其是刻意追求短代码就更没有必要了
要知道,代码短了,可读性就差
两者协调好,才能称为好程序^^

悉雨辰寂
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-04
#include <stdio.h>
void main()
{
unsigned int sour;
int count=0,i;
printf("Input an Hex Number:");
scanf("%x",&sour);
for(i=0;i<16;i++)
{
if(sour%2==1) count++;
sour/=2;
}
printf("The Number Contains %d 1s\n",count);
getch();
}

以上是第一题答案。
你的第二题基本上正确,希望楼主能够顺着思路,自己解决下自己的程序,培养自学能力和调试能力。

2008年4月4日16:01:58
哎,好吧,给你第二题的答案。不过,我建议你看看我的程序,然后试着对你自己的程序进行小修改。调试程序可是C语言的基本工哦……

#include <stdio.h>
main()
{
int n,i,yy,mm,dd,by,bm,bd,mdsum=0,days=0;
int md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

printf("Input year month day today: ");
scanf("%d%d%d",&yy,&mm,&dd);
printf("Input year month day birthday: ");
scanf("%d%d%d",&by,&bm,&bd);

for(n=by;n<yy;n++)
if(n%100!=0&&n%4==0||n%400==0) days+=366;
else days+=365;

if(by%100!=0&&by%4==0||by%400==0) md[2]=29;
for(n=1;n<bm;n++) mdsum+=md[n];
days-=(mdsum+bd);

mdsum=0;
if(yy%100!=0&&yy%4==0||yy%400==0) md[2]=29;
for(n=1;n<mm;n++) mdsum+=md[n];
days+=mdsum+dd;

printf("You have come here for %d days!",days);

getch();
}本回答被提问者采纳
第2个回答  2008-04-04
我没有改你的输入语句,如果改了会更短一点。

#include <stdio.h>

void main()
{
int i,j,t=0,day,Y1,M1,D1,Y2,M2,D2;

printf("\t*********your life lastint?*********\n");

printf("please put your birthday year:\t\n");
scanf("%d",&Y1);

printf("请输入您的出生月份:\t\n");
scanf("%d",&M1);

printf("请输入您的出生日号:\t\n");
scanf("%d",&D1);

printf("请输入当前年份:\t\n");
scanf("%d",&Y2);

printf("请输入当前月份:\t\n");
scanf("%d",&M2);

printf("请输入当前日号:\t\n");
scanf("%d",&D2);

for(i=Y1;i<Y2;i++)
if(i%4==0)t++;
if((Y1%4==0)||(M1>2))t--;
for(j=M1;j<12;j++)
{
if(j<=7){if(j%2==1)t++;}
else if(j%2==0)t++;
}
for(j=1;j<M2;j++)
{
if(j<=7){if(j%2==1)t++;}
else if(j%2==0)t++;
}

day=(30-D1)+(12-M1)*30+(Y2-Y1-1)*365+(M2-1)*30+D2+t;
printf("total day:%d\n",day);
}
第3个回答  2008-04-04
楼上写的比较简洁,也很正确

楼主写的太乱了

本来我打算帮楼主改改的,鉴于楼上说要锻炼他的自学能力,我也不费这个心了
第4个回答  2008-04-04
第二题有什么简单的方法吗?期待高手~