/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:用筛选法求100以内的素数
位置:C程序设计(第四版)2010年6月第四版 168页习题1
*/
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[101];//101个元素
for(i=1;i<=100;i++)//不要a0
a[i]=i;//a1-a100分别赋值1-100
a[1]=0;//先挖掉a1
for(i=2;i<sqrt(100);i++)//除数
for(j=i+1;j<100;j++)//被除数
{
if(a[i]!=0 && a[j]!=0)//当被挖掉以后为0的时候不用除
if(a[j]%a[i]==0)
a[j]=0;//挖掉素数
}
for(i=2,n=0;i<=100;i++)
{
if(a[i]!=0)//输出没有挖掉的数
{
printf("%5d",a[i]);
n++;
}
if(n==10)//每10个数换行
{
printf("\n");
n=0;
}
}
printf("\n");
return 0;
}
/*Dev-c++输出结果:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 100
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:用选择法对10个整数排序
位置:C程序设计(第四版)2010年6月第四版 168页习题2
*/
#include<stdio.h>
int main()
{
int i,j,min,temp,a[11];
printf("enter data:\n");
for(i=1;i<=10;i++)//输入10个整数
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("\n");
printf("The orginal numbers:\n");
for(i=1;i<=10;i++)//将输入的整数直接输出
printf("%5d",a[i]);
printf("\n");
for(i=1;i<=9;i++)//将输入的整数排序(小到大)
{
min=i;
for(j=i+1;j<=10;j++)//将后面的数和当前啊a[min]比较,小于的的赋值给min
if(a[min]>a[j])
min=j;//获取最小整数的下标
temp=a[i];//中间变量temp,以下三行是交换
a[i]=a[min];
a[min]=temp;
}
printf("\nThe sorted numbers:\n");
for(i=1;i<=10;i++)//按从小到大输出
printf("%5d",a[i]);
printf("\n");
return 0;
}
/*Dev-c++输出结果:
enter data:
a[1]=10
a[2]=9
a[3]=8
a[4]=7
a[5]=6
a[6]=5
a[7]=4
a[8]=3
a[9]=2
a[10]=1
The orginal numbers:
10 9 8 7 6 5 4 3 2 1
The sorted numbers:
1 2 3 4 5 6 7 8 9 10
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:求一个3*3的整型矩阵对角线元素之和
位置:C程序设计(第四版)2010年6月第四版 168页习题3
*/
#include<stdio.h>
int main()
{
int a[3][3],sum=0;//三行三列的数组
int i,j;
printf("enter data:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);//输入最大三位数,防止数据超过变量
for(i=0;i<3;i++)
sum=sum+a[i][i];//其实是a[0][0]+a[1][1]+a[2][2],不是求对角线全部和(对角线有两条,这里只求出其中一条的和)
printf("sum=%6d\n",sum);
return 0;
}
/*Dev-c++输出结果:
enter data:
1
2
3
4
5
6
7
8
9
sum= 15
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
位置:C程序设计(第四版)2010年6月第四版 168页习题4
*/
#include<stdio.h>
int main()
{
int a[11]={1,4,6,9,13,16,19,28,40,100};//定义并初始化升序数组,最后的a[10]=0
int temp1,temp2,number,end,i,j;
printf("array a:\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
printf("insert data:");
scanf("%d",&number);
end=a[9];
if(number>end)//跟最后一个数比较
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)//直到有一个a[i]比number大
{
temp1=a[i];//将这个数给中间变量
a[i]=number;//number代替a[i]
for(j=i+1;j<11;j++)//后面的数组每位都加一
{
temp2=a[j];//下面三行都是用中间变量temp2进行数据交换
a[j]=temp1;
temp1=temp2;
}
break;//找到了就不用再看后面的数(关键)
}
}
}
printf("Now array a:\n");
for(i=0;i<11;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
/*Dev-c++输出结果:
array a:
1 4 6 9 13 16 19 28 40 100
insert data:50
Now array a:
1 4 6 9 13 16 19 28 40 50 100
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:将一个数组中的值按逆序重新存放。例如,原来循序为8,6,5,4,1。要求改成1,4,5,6,8。
位置:C程序设计(第四版)2010年6月第四版 168页习题5
*/
#include<stdio.h>
#define N 5
int main()
{
int a[N],i,temp;
printf("enter array a:\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("array a:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
for(i=0;i<N/2;i++)//只要将前一半和后一半交换就行,单数则中间一项不变
{
temp=a[i];
a[i]=a[N-i-1];//将对应的项赋值(后一半赋值给前一半)
a[N-i-1]=temp;// 将对应的项赋值(前一半赋值给后一半)
}
printf("\nNow array a:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}
/*Dev-c++输出结果:
enter array a:
8
6
5
4
1
array a:
8 6 5 4 1
Now array a:
1 4 5 6 8
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:输出以下的杨辉三角形(要求输出10行)
位置:C程序设计(第四版)2010年6月第四版 168页习题6
*/
#include<stdio.h>
#define N 10
int main()
{
//杨辉三角规律:a[i][j]=a[i-1][j]+a[i-1][j-1];每一行的首尾是1,其他数=上一行同列+上一行前列
int i,j,a[N][N];
for(i=0;i<N;i++)
{
a[i][i]=1;//尾数为1
a[i][0]=1;//头数为1
}
for(i=2;i<N;i++)//从第三行开始
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];// 其他数=上一行同列+上一行前列
for(i=0;i<N;i++)//输出杨辉三角
{
for(j=0;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
/*Dev-c++输出结果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为8 1 6 3 5 7 4 9 2
要求输出1~n^2的自然数构成的魔方阵
位置:C程序设计(第四版)2010年6月第四版 168页习题7
*/
#include<stdio.h>
int main()
{
int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{
printf("enter n(n=1--15):");
scanf("%d",&n);
if((n!=0) && (n<=15) && (n%2!=0))//输入1~15的奇数
p=0;
//初始化
for(i=1;i<=n;i++)//这个数组时从a[1][1]开始
for(j=1;j<=n;j++)
a[i][j]=0;//初始化为0
//建立魔方阵
j=n/2+1;//中间列下标
a[1][j]=1;//第一行中间列赋值1
for(k=2;k<=n*n;k++)
{
i=i-1;//每一个数存放比前一个数的行数减一 (正常情况)
j=j+1;//每一个数存放比前一个数的列数加一 (正常情况)
if((i<1) && (j>n))//当上一个数是第一行第n列时,则把下一个数放到上一个数的下面
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;//如果上一个数的行数为1,则下一行数为n
if(j>n)
j=1;//如果上一个数的列数为n,则下一列数为1
}
if(a[i][j]==0)
a[i][j]=k;//这个地方没有数据
else
{//这个地方有数据,则把下一个数放到上一个数的下面
i=i+2;
j=j-1;
a[i][j]=k;
}
}
//输出魔方阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
return 0;
}
/*Dev-c++输出结果:
enter n(n=1--15):5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。
位置:C程序设计(第四版)2010年6月第四版 169页习题8
*/
#include<stdio.h>
#define N 4
#define M 5
int main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please input matriz:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)//遍历每一行
{
max=a[i][0];//假设每一行第一个数为最大
maxj=0;
for(j=0;j<M;j++)//遍历一行中每一个数
if(a[i][j]>max)//找出一行中最大的值 给max,下标给maxj
{
max=a[i][j];
maxj=j;
}
flag=1;//标记有鞍点
for(k=0;k<N;k++)//遍历一列中每一个数
if(max>a[k][maxj])//如果找到该列中的数比max大
{
flag=0;//标记没有鞍点
continue;//结束本次循环(有没有都可以吧?break;呢?不是更好吗??)
}
if(flag)//存在鞍点,输出
{
printf("a[%d][%d]=%d\n",i,maxj,max);
break;
}
}
if(!flag)//不存在鞍点
printf("It is not exis!\n");
return 0;
}
/*Dev-c++输出结果:
please input matriz:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
a[0][4]=5
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素。如果该数不在数组中,则输出“无此数”
位置:C程序设计(第四版)2010年6月第四版 169页习题9
*/
#include<stdio.h>
#define N 15
int main()
{
//时间复杂度:int(log2n)+1
int i,number,top,bott,mid,loca,a[N],flag=1,sign;
char c;
printf("enter data:\n");
scanf("%d",&a[0]);//输入一个数
i=1;
while(i<N)//输入剩下的14个数
{
scanf("%d",&a[i]);
if(a[i]>=a[i-1])//如果输入的数比上一个数小i++否则重新输入覆盖原来的值
i++;
else
printf("enter this data again:\n");
}
printf("\n");
for(i=0;i<N;i++)//输出所有数
printf("%5d",a[i]);
printf("\n");
while(flag)//查找开始
{
printf("input number to look for:");
scanf("%d",&number);//输入要查找的数
sign=0;//未查找到
top=0;//查找区间起始位置
bott=N-1;//查找区间最末位置
if((number<a[0]) || (number>a[N-1]))// 小于最小大于最大,则不在该数组内,返回-1
loca=-1;//无法找到返回-1
while((!sign) && (top<=bott))//折半查找算法
{
mid=(bott+top)/2;//取折中数
if(number==a[mid])
{
loca=mid;
printf("Has found %d,its position is %d\n",number,loca+1);//数组从0开始,所以位置要加1
sign=1;//标记找到了
}
else if(number<a[mid])
{
bott=mid-1;//将尾部赋值给bott 变成top~mid-1
}
else
top=mid+1;//将头部赋值给top 变成mid+1~bott
}
if((!sign || loca==-1))
printf("cannot find %d.\n",number);//无法找到
printf("continue or not(Y/N)?");//继续吗?
scanf(" %c",&c);
if(c=='N' || c=='n')//输入N OR n结束否则继续
flag=0;//结束
}
return 0;
}
/*Dev-c++输出结果:
enter data:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
input number to look for:16
cannot find 16.
continue or not(Y/N)?y
input number to look for:17
cannot find 17.
continue or not(Y/N)?y
input number to look for:7
Has found 7,its position is 7
continue or not(Y/N)?n
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能: 有三行文字每行80字符,统计英文大写字母,英文小写字母,数字,空格以及其他字符的个数
位置:C程序设计(第四版)2010年6月第四版 169页习题10
*/
#include<stdio.h>
int main()
{
int i,j,upp,low,dig,spa,oth;
char text[3][80];
upp=low=dig=spa=oth=0;//初始化大写,小写,数字,空格,其他为0
for(i=0;i<3;i++)
{
printf("please input line %d:\n",i+1);
gets(text[i]);
for(j=0;j<80 && text[i][j]!='\0';j++)
{
if(text[i][j]>='A' && text[i][j]<='Z')
upp++;
else if(text[i][j]>='a' && text[i][j]<='z')
low++;
else if(text[i][j]>='0' && text[i][j]<='9')
dig++;
else if(text[i][j]==' ')
spa++;
else
oth++;
}
}
printf("\nupper case:%d",upp);
printf("\nlower case:%d",low);
printf("\ndigit :%d",dig);
printf("\nspace :%d",spa);
printf("\nother :%d\n",oth);
return 0;
}
/*Dev-c++输出结果:
please input line 1:
i am a student
please input line 2:
123456
please input line 3:
ASDF*&
upper case:4
lower case:11
digit :6
space :3
other :2
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:输出以下图案
位置:C程序设计(第四版)2010年6月第四版 169页习题11
*/
#include<stdio.h>
int main()
{
int a[5]={'*','*','*','*','*'};
int i,j,k;
char space=' ';
for(i=0;i<5;i++)
{
printf("\n");
printf(" ");
for(j=1;j<=i;j++)//输出空格
printf("%c",space);
for(k=0;k<5;k++)//输出*号
printf("%c",a[k]);
}
printf("\n");
return 0;
}
/*Dev-c++输出结果:
*****
*****
*****
*****
*****
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:翻译密码,第1个字母变成第26个字母,第i个字母变成第26-i+1个字母
位置:C程序设计(第四版)2010年6月第四版 169页习题12
*/
#include<stdio.h>
int main()
{
//方法一:用两个字符数组分别存放原文和密码
//如果ch[j]是大写字母则它是第(ch[j]-64)个大写字母,转换成第(26-i+1)个大写字母,而26-i+1=26-(ch[j]-64)+1=91-ch[j],转换成第(91-ch[j])个字母
//因此这个字母为91-ch[j]+64=155-ch[j]
//如果ch[j]是小写字母则它是第(ch[j]-64)个大写字母,转换成第(26-i+1)个大写字母,而26-i+1=26-(ch[j]-64)+1=91-ch[j],转换成第(91-ch[j])个字母
//因此这个字母为26+96-ch[j]+1+96=219-ch[j]
// int j,n;
// char ch[80],tran[80];
// printf("input cipher code:");
// gets(ch);
// printf("\ncipher code:%s",ch);
// j=0;
// while(ch[j]!='\0')
// {
// if((ch[j]>='A') && (ch[j]<='Z'))
// tran[j]=155- ch[j];
// else if((ch[j]>='a') && (ch[j]<='z'))
// tran[j]=219-ch[j];
// else
// tran[j]=ch[j];
// j++;
// }
// n=j;
// printf("\noriginal text:");
// for(j=0;j<n;j++)
// putchar(tran[j]);
// printf("\n");
// return 0;
//方法二:只用一个字符数组
int j,n;
char ch[80];
printf("input cipher code:");
gets(ch);
printf("\ncipher code:%s",ch);
j=0;
while(ch[j]!='\0')
{
if((ch[j]>='A') && (ch[j]<='Z'))
ch[j]=155- ch[j];
else if((ch[j]>='a') && (ch[j]<='z'))
ch[j]=219-ch[j];
else
ch[j]=ch[j];
j++;
}
n=j;
printf("\noriginal text:");
for(j=0;j<n;j++)
putchar(ch[j]);
printf("\n");
return 0;
}
/*Dev-c++输出结果:
input cipher code:abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ
cipher code:abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ
original text:zyxwvutsrqponmlkjihgfedhbaZYXWVUTSRQPONMLKJIHGFEDHBA
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:将两个字符串连接起来,不要用strcat
位置:C程序设计(第四版)2010年6月第四版 169页习题13
*/
#include<stdio.h>
int main()
{
char s1[80],s2[40];
int i=0,j=0;
printf("input string s1:");
scanf("%s",s1);
printf("input string s2:");
scanf("%s",s2);
while(s1[i]!='\0')//获取s1
i++;
while(s2[j]!='\0')//获取s2
s1[i++]=s2[j++];//在s1后追加s2
s1[i]='\0';//最后添加结束符
printf("\nThe new string is:%s\n",s1);
return 0;
}
/*Dev-c++输出结果:
input string s1:iama
input string s2:student
The new string is:iamastudent
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:将两个字符串s1和s2比较,若s1>s2输出一个正数,若s1=s2输出0,若s1<s2输出一个负数,不要用strcpy函数
两个字符串用gets函数读入,输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值
位置:C程序设计(第四版)2010年6月第四版 169页习题14
*/
#include<stdio.h>
int main()
{
int i,resu;
char s1[100],s2[100];
printf("input string1:");
gets(s1);
printf("\ninput string2:");
gets(s2);
i=0;
while((s1[i]==s2[i]) && (s1[i]!='\0'))//当s1和s2的字母一样并且s1没有结束的时候
i++;
if(s1[i]=='\0' && s2[i]=='\0')//如果相等返回0
resu=0;
else//否则比较他们的差值
resu=s1[i]-s2[i];
printf("\nresult:%d\n",resu);
return 0;
}
/*Dev-c++输出结果:
input string1:And
input string2:Aid
result:5
*/
/* 创建时间:20171227
创建人:fangweijun(773714759@qq.com)
功能:将字符数组s2中的全部字符赋值到字符数组s1中,不用strcpy,复制时'\0'也要复制过去,后面的不用复制
位置:C程序设计(第四版)2010年6月第四版 169页习题15
*/
#include<stdio.h>
#include<string.h>
int main()
{
char s1[80],s2[80];
int i;
printf("input s2:");
scanf("%s",s2);
for(i=0;i<strlen(s2);i++)//strlen返回字符串长度,并根据长度逐一赋值到s1字符串中,完成复制
s1[i]=s2[i];
printf("s1:%s\n",s1);
return 0;
}
/*Dev-c++输出结果:
input s2:iamastudent
s1:iamastudent
*/