本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2009年06月05日 统计字数: 3995字 阅读时间: 8分钟阅读 本文链接: https://soulteary.com/2009/06/05/c-start-1.html ----- # [C]基础题练习10道 再次看到唯C论坛的电子书了..手痒,先把1~10练下吧。 第一道题,感觉知识点就是判断集合范围,和和尚吃水,鸡兔同笼是一样。 再次看到唯C论坛的电子书了..手痒,先把1~10练下吧。 第一道题,感觉知识点就是判断集合范围,和和尚吃水,鸡兔同笼是一样。 ```c /* 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?*/ #include #include int main(int argc, char *argv[]) { int i,j,k,t; t=0; printf( "无重复3位数如下:n "); for(i=1;i<5;i++){ for (j=1;j<5;j++){ for (k=1;k<5;k++){ if (!((k==j)||(k==i)||(j==i))){ printf( "%d%d%dn ",i,j,k); t++; } } } } printf( "共有%d个不重复的三位数n ",t); system( "PAUSE "); return 0; } ``` 这道题似乎还是这样快一些,采取贪心策略结合常量计算应该已经达到最快了。 ```c /* 题目: 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%, 高于100万元时,超过100万元的部分按1%提成, 从键盘输入当月利润I,求应发放奖金总数?*/ #include #include int main(int argc, char *argv[]) { long int lngInput,lngRet; scanf( "%d ", &lngInput); lngRet = Fir_Dig(lngInput); printf( "利息:%dn ",lngRet); system( "PAUSE "); return 0; } int Fir_Dig(long int lngInput) { //10w*0.1+10w*0.075+20w*0.05+20w*0.03+40w*0.015+(r-100w)*0.01 long int lngTmp,lngRet; if (lngInput > 1000000){ lngTmp =lngInput – 1000000; lngRet=lngTmp*0.01+39500; return lngRet; } if ((lngInput>600000) && (lngInput <= 1000000)){ lngTmp =lngInput – 600000; lngRet=lngTmp*0.015+33500; return lngRet; } if ((lngInput>400000) && (lngInput <= 600000)){ lngTmp =lngInput – 400000; lngRet=lngTmp*0.03+27500; return lngRet; } if ((lngInput>200000) && (lngInput <= 400000)){ lngTmp =lngInput – 200000; lngRet=lngTmp*0.05+17500; return lngRet; } if ((lngInput>100000) && (lngInput <= 200000)){ lngTmp =lngInput – 100000; lngRet=lngTmp*0.075+10000; return lngRet; } if ((lngInput>0) && (lngInput <= 100000)){ lngTmp =lngInput; lngRet=lngTmp*0.1; return lngRet; } } ``` 这道题其实和判断集合的方法一样,使用双循环可以省略一次计算,提前将数据计算保存又可以省略至少2n次计算 ```c /* 题目: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? */ #include #include int main(int argc, char *argv[]) { long int i,j,k; for (i=1;i<2000;i++) { k=i+268;j=sqrt(k); if (j*j==k) { k=i+100;j=sqrt(k); if (j*j==k){printf ( "%dn ",i);} } } system( "PAUSE "); return 0; } ``` 接下来这个似乎是考察了很多细节,为了实现效高率,代码只能“啰嗦”了 ```c /* 题目: 输入某年某月某日,判断这一天是这一年的第几天? */ #include #include int main(int argc, char *argv[]) { int y,m,d; int a,b,r; a=0,b=0,r=0; printf( "请输入年份: ");scanf( "%d ", &y); if ((y<1900)||(y>2059)) { printf( "输入年份错误[1~2059]n "); system( "PAUSE "); return 0; } //判断闰年 if ((y%4==0) &&(y%100!=0)){a=1;} printf( "请输入月份: ");scanf( "%d ", &m); if ((m<0) &&(m>12)) { printf( "输入月份错误[1~12]n "); system( "PAUSE "); return 0; } //累计月份日期 switch (m) { case 1:b=0;break; case 2:b=31;break; case 3:if (a==1){b=59;}else{b=60;};break; case 4:if (a==1){b=90;}else{b=91;};break; case 5:if (a==1){b=120;}else{b=121;};break; case 6:if (a==1){b=151;}else{b=152;};break; case 7:if (a==1){b=181;}else{b=182;};break; case 8:if (a==1){b=212;}else{b=213;};break; case 9:if (a==1){b=243;}else{b=244;};break; case 10:if (a==1){b=273;}else{b=274;};break; case 11:if (a==1){b=304;}else{b=305;};break; case 12:if (a==1){b=334;}else{b=335;};break; } printf( "请输入日期: ");scanf( "%d ", &d); if ((m==1) &&(m==3) &&(m==5) &&(m==7) &&(m==8) &&(m==10) &&(m==12)) { if ((d<1) &&(d>31)) { printf( "输入日期错误[1~31]n "); system( "PAUSE "); return 0; } } if ((m==4) &&(m==6) &&(m==9) &&(m==11)) { if ((d<1) &&(d>30)) { printf( "输入日期错误[1~30]n "); system( "PAUSE "); return 0; } } if (m==2) { if (a==1) { if ((d<1) &&(d>29)) { printf( "输入日期错误[1~29]n "); system( "PAUSE "); return 0; } } else { if ((d<1) &&(d>28)) { printf( "输入日期错误[1~28]n "); system( "PAUSE "); return 0; } } } r=b+d; printf( "%d年%d月%d日,是该年第%d天n ",y,m,d,r); system( "PAUSE "); return 0; } ``` 变量的交换也是传统的经典题了,这里使用XOR交换大法 ```c /* 题目: 输入三个整数x,y,z,请把这三个数由小到大输出。 */ #include #include int main(int argc, char *argv[]) { long int x,y,z; printf( "请输入第1个数字: ");scanf( "%d ", &x); printf( "请输入第2个数字: ");scanf( "%d ", &y); printf( "请输入第3个数字: ");scanf( "%d ", &z); /* XOR 进行变量数值交换 soulteary.com 变量A = 变量B Xor 变量A 变量B = 变量B Xor 变量A 变量A = 变量A Xor 变量B */ //将大数替换到下一位 1x to 2y if (x >= y) { y= x^y; x= x^y; y= y^x; } //(1|2)x to (2|3)z if (x >= z) { z= x^z; x= x^z; z= z^x; } if (y >= z) { z= y^z; y= y^z; z= z^y; } printf( "%d,%d,%dn ",x,y,z); system( "PAUSE "); return 0; } ``` 没啥好说的...基础函数 ```c /*题目: 用*号输出字母C的图案。 */ #include #include int main(int argc, char *argv[]) { printf( " *****n "); printf( " * *n "); printf( " *n "); printf( " * *n "); printf( " *****n "); system( "PAUSE "); return 0; } ``` 第七题忽略,我的是DEV C++... 似乎我的比那个简单的多.... ```c /*题目: 输出9*9口诀 */ #include #include int main(int argc, char *argv[]) { int i,j; for (i=1;i<10;i++) { for (j=1;j #include int main(int argc, char *argv[]) { int i,j; for (i=1;i<9;i++) { for (j=1;j<9;j++) { if ((j+i)%2==0){printf( "■ ");} else{printf( "□ ");} if (j==8){printf( "n ");} } } system( "PAUSE "); return 0; } ``` 话说俺对ASCII控制符不熟悉..笑脸我居然第一次列印出:)... 算法方面我觉得我的可读性比那个好。 ```c /*题目: 打印楼梯,同时在楼梯上方打印两个笑脸。 */ #include #include int main(int argc, char *argv[]) { int i,j; printf( "11n ");/*输出两个笑脸*/ for (i=1;i<10;i++) { for (j=1;j