再次看到唯C论坛的电子书了..手痒,先把1~10练下吧。 第一道题,感觉知识点就是判断集合范围,和和尚吃水,鸡兔同笼是一样。

再次看到唯C论坛的电子书了..手痒,先把1~10练下吧。

第一道题,感觉知识点就是判断集合范围,和和尚吃水,鸡兔同笼是一样。

/* 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?*/
#include <stdio.h>
#include <stdlib.h>
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;
}

这道题似乎还是这样快一些,采取贪心策略结合常量计算应该已经达到最快了。

/* 题目:
企业发放的奖金根据利润提成。利润(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 <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long int lngInput,lngRet;
scanf( "%d ", &amp;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次计算

/* 题目:
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
*/
#include <stdio.h>
#include <stdlib.h>
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;
}

接下来这个似乎是考察了很多细节,为了实现效高率,代码只能“啰嗦”了

/* 题目:
输入某年某月某日,判断这一天是这一年的第几天?
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int y,m,d;
int a,b,r;
a=0,b=0,r=0;
printf( "请输入年份: ");scanf( "%d ", &amp;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 ", &amp;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 ", &amp;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交换大法

/* 题目:
输入三个整数x,y,z,请把这三个数由小到大输出。
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long int x,y,z;
printf( "请输入第1个数字: ");scanf( "%d ", &amp;x);
printf( "请输入第2个数字: ");scanf( "%d ", &amp;y);
printf( "请输入第3个数字: ");scanf( "%d ", &amp;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的图案。
*/
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
printf( " *****n ");
printf( " * *n ");
printf( " *n ");
printf( " * *n ");
printf( " *****n ");
system( "PAUSE ");
return 0;
}

第七题忽略,我的是DEV C++… 似乎我的比那个简单的多….

/*题目:
输出9*9口诀
*/
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
int i,j;
for (i=1;i<10;i++)
{
for (j=1;j<i+1;j++)
{
printf( " %d x %d ",i,j);
if (j==i){printf( "n ");}
}
}
system( "PAUSE ");
return 0;
} 

写完一看和那个电子书的基本一样…回头再想想有啥思路没。

/*题目:
要求输出国际象棋棋盘。
*/
#include <stdio.h>
#include <stdlib.h> 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控制符不熟悉..笑脸我居然第一次列印出:)… 算法方面我觉得我的可读性比那个好。

/*题目:
打印楼梯,同时在楼梯上方打印两个笑脸。
*/
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[])
{
int i,j;
printf( "11n ");/*输出两个笑脸*/
for (i=1;i<10;i++)
{
for (j=1;j<i+1;j++)
{
printf( "■ ");
if (j==i){printf( "n ");}
}
}
system( "PAUSE ");
return 0;
}