(1)
C语言输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位).
//2997 璇疯緭鍏ヤ竴涓暣鏁?2997
0000-0000 0000-0000 0000-1011 1011-0101
瀹冪殑浠庡彸寮€濮嬬殑绗?1-8浣嶄负:
1011
1011 注意从右是从0开始算的
void bin32bdis(int data)
{
int i=32;
while(i--) //32---1
{
if(data & (1<<i)) //31--0
printf("1");
else
printf("0");
if(i%4==0)
{
if(i%8==0)
printf(" ");
else
printf("-");
}
}
putchar(10);
}
int main(void)
{
int i,x;
printf("请输入一个整数:");
scanf("%d",&x);
bin32bdis(x);
printf("它的从右开始的第11-8位为:\n");
for(i=11;i>7;i--)
printf("%d",(x&(1<<i))>0)//注意要加一个>0,要不然出来就会是一个很大的数;这是因为int包括符号,加了unsigned后,就可以不用加括号()
printf("\n");
}对无符号数和有符号中的正数补 0;有符号数中的负数,取决于所使用的
系 统: 补 0 的称为"逻辑右移",补 1 的称为"算术右移"。
(2)94、打印出杨辉三角形(要求打印出10行如下图)。
【参考答案】
int main()
{
int i,j;
int a[10][10];
printf("\n");
for(i=0;i<10;i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for(i=2;i<10;i++)
{
for(j=1;j<i;j++)//注意是j<i j=1,因为i下标的值是j下标的值加的
{
a[i][j] = a[i-1][j-1]+a[i-1][j];//注意下标
}
}
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
(3)mystrcmp的自实现
int mystrcmp(const char *s1,const char *s2)
{
for(;*s1&&*s2;s1++,s2++)
{
if(*s1 == *s2)
continue ;
else
return *s1 - *s2;
}
return *s1 - *s2;
}
(4)计算字符串中子串出现的次数
char * myStrstr(char *s1,char *s2)
{
int n;
if(*s2) //查找的数据为空
{
while(*s1)
{
for( n=0;*(s1+n) == *(s2+n); n++)
{
if(*(s2+n+1) == '\0')
return s1;
}
s1++;
}
return NULL;
}
else
return NULL; //return s1;??
}
int main()
{
char *s1 = "chikn123123";char *s2 = "123";
int count = 0;
int len = strlen(s2);
while(s1 = myStrstr(s1,s2))
{
count++;
s1 += len;
}
printf("%d",count);
}
(5)最低级:,
逗号运算符也称为顺序求值运算符,在C语言中,运算级别最低。
(6)一个数+100是完全平方数,在加168也是一个完全平方书数
void mySwap(int *i, int *j)
{
int t = *i;
*i = *j;
*j = t;
}
int main(void)
{
int flag = 0;
int i,j,k;
for(i=00;i<10000;i++)
{
for(j=0;j<400;j++)//因为300*300=900,400*400=11600所以就在这个范围
{
if(j*j == i+100)
{
for(k=0;k<400;k++)
{
if(k*k == i+268)//和上面一起相当于两个if语句
{
flag = 1;
printf("%d\n",i);
break;
}
}
}
if(flag)
break;
}
if(flag)
break;
}
return 0;
}
(8)求年份是平年还是润年
int main()
{
int year,leap;
printf("enter year");
scanf("%d",&year);
if((year%100!=0 && year%4==0) || (year%400==0))
leap = 1;
else
leap = 0;
if(leap)
printf("%d is",year);
else
printf("%d is not",year);
return 0;
}
(9)求解方程a*x*x+b*c+c=0方程的解
a=0,不是二次fangc
b*b-4*a*c=0,有两个相当的根
b*b-4*a*c>0,有两个不相当的根
b*b-4*a*c<0,有两个共轭复根
int main()
{
double a,b,c,disc,x1,x2,realpart,imagepart;
scanf("%lf,%lf,%lf",&a,&b,&c);
printf("The equation ");
if(fabs(a) <= 1e-6)//注意等于的要<来辨别
printf("is not a equation");
else
{
disc = b*b-4*a*c;
if(fabs(disc <= 1e-6))
{
printf("has two equal roots:%8.4f\n",-b/(2*a));
}
else if(disc > 1e-6)
{
x1 = (-b+sqrt(disc)/(2*a));
x2 = (-b+sqrt(disc)/(2*a));
printf("has two root %8.4f %8.4f",x1,x2);
}
else
{
realpart = -b/(2*a);
imagepart = sqrt(-disc)/(2*a);//注意这里是要为负号的
printf("has complex root\n");
printf("%8.4f+%8.4if\n",realpart,imagepart);//输出另一个复数
printf("%8.4f-%8.4if\n",realpart,imagepart);//输出另外一个复数
}
}
return 0;
}
(10)求三个数里面最大的那个数
int main()
{
int a,b,c;
int max,temp;
scanf("%d,%d,%d",&a,&b,&c);
temp=a>b?a:b;
max=temp>c?temp:c;
printf("%d\n",max);
return 0;
}
(10)一百分制的成绩,分为A B C D E
int main()
{
double score;
char grade;
scanf("%lf",&score);
while(score>100 || score<0)
{
printf("fault please repart");
scanf("%lf",&score);
}
switch((int)(score/10))注意这里的int
{
case 10:
case 9:grade = 'A';break;//注分号的位置,有两个;
case 8:grade = 'B';break;
case 7:grade = 'C';break;
case 6:grade = 'D';break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:grade = 'E';break;
}
printf("%c %lf",grade,score);
return 0;
}
(11)手动输入4个值,按照由小到大输入
void swap(int *p,int *q)
{
*p ^= *q;
*q ^= *p;
*p ^= *q;
}
void popsort(int *p,int n)
{
int i,j;
int flag;
for(i=0;i<n-1;i++)
{
flag=1;
for(j=0;j<n-i-1;j++)
{
if(p[j]>p[j+1])
{
swap(&p[j],&p[j+1]);
flag=0;
}
}
if(!flag)
break;
}
}
int main(void)
{
int arr[4];
int i;
srand(time(NULL));
for(i=0;i<4;i++) scanf("%d",&arr[i]);
for(i=0;i<4;i++)
{
arr[i] = rand()%10;
}
for(i=0;i<4;i++)
{
printf("%d",arr[i]);
}
putchar(10);
popsort(arr,4);
for(i=0;i<4;i++)
{
printf("%d",arr[i]);
}
return 0;
}
(12)4个圆塔113(12)谭浩强
int main( )
{
int h = 10;
float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
printf("please scanf point(x,y):");
scanf("%f,%f",&x,&y);
d1 = (x-x4)*(x-x4)+(y-y4)*(y-y4);/*求该点到各中心点距离*/
d2 = (x-x1)*(x-x1)+(y-y1)*(y-y1);
d3 = (x-x2)*(x-x2)+(y-y2)*(y-y2);
d4 = (x-x3)*(x-x3)+(y-y3)*(y-y3);
if(d1>1 && d2>1 && d3>1 && d4>1)h=0;/*判断该点是否在塔外*/
printf("hop%d\n",h);
return 0;
}
(13)输出如下的代码
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
int main()
{
int i,j,n=0;
for(i=1;i<=4;i++)
for(j=1;j<=5;j++,n++)从1开始的
{
if(n%5==0)putchar(10);//注意是n
printf("%d\t",i*j);//要加\t
}
putchar(10);
return 0;
}
(14)pi/4 = 1-1/3+1/5-1/7……利用这个来求pi的大小
int main()
{
int sign = 1;
double pi = 0.0,n = 1.0,term = 1.0;//注意要有double
while (fabs(term)>=1e-6)//1*10(-6)一个很小的数
{
pi = pi+term;
sign = -sign;
n = n+2;
term = sign/n;
}
pi = pi*4;
printf("pi=%10.8f\n",pi);
}
(15)f1 = 1(n=1),f2 = 1(n=1),f(n)=f(n-)+f(n-2);,求前面40个数的大小
int main()
{
int f1 = 1,f2 = 1,f3;
int i;
printf("%12d\n%12d\n",f1,f2);
for(i=1;i<=38;i++)
{
f3 = f1+f2;
printf("%12d\n",f3);
f1 = f2;
f2 = f3;
}
return 0;
}
(16)求一个数的是否为素数
int main()
{
int n,i;
printf("输入数:");
scanf("%d",&n);
int k = sqrt(n);//让一个数开平方
for(i=1;i<k;i++)
if(n%i==0)break;
if(i<=k)printf( "not shi ");//注意i范围
else
printf("is");
return 0;
}
(17)求100-200间的全部素数
int main()
{
int n,k,i,m=0;
for(n=101;n<=200;n++)
{
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)
break;
if(i>=k+1)//注意i范围
{
printf("%d ",n);//注意加空格
m=m+1;
}
if(m%10==0)printf("\n");//每10个数空一行
}
printf("\n");
return 0;
}
(18)译密码:把26个字母一次往后移动4个(138页,谭浩强)
int main()
{
char c;
c = getchar();//注意这个用来输入一个字符的,但可以先把要输入得字符一次性输入,
while (c!='\n')//因为他会把这些数据保存在缓存区中
{//注意它的条件是不能输出\n
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))//输入的必须是字母
{
if((c>='W'&&c<='Z')||(c>='w'&&c<='z'))//输入的w x y x时
c=c-22;
else
c=c+4;//其他的往后面减4个数
}
printf("%c",c);
c = getchar();
}
printf("\n");
return 0;
}
//手动输入跳多少个字节
int fun(char *str1)
{
if(*str1>='A' && *str1<='Z')
return 1;
else
return 0;
}
int main()
{
char str1[200];
gets(str1);
int len = strlen(str1);
int n,i;
scanf("%d",&n);
for(i=0;i<len;i++)
{
if(fun(&str1[i]))//这里是一个一个的传
{
if(str1[i]+n>'Z')//按照数值来比较
str1[i] = str1[i]-26+n;
else
str1[i] = str1[i]+n;//注意这里是加
}
}
printf("%s",str1);
}
(19)输入两个正整数,求其最大公约数和最小公倍数
提示:采用辗转取余算法。m除以n的余数为零,则n为最大公约数;余数不为零,则将n付给m,余数赋给n,在重复上述操作,直到余数为零为止···
int main( )
{
int p,r,n,m,temp;
printf("请输入两个正整数n,m:");
scanf("%d,%d",&n,&m);
if(n<m)
{
temp=n;
n=m;
m=temp;
}
p=n*m;//注意
while(m!=0) //注意它得是while
{
r=n%m;
n=m;
m=r;
}
printf("它们的最大公约数为:%d\n",n);
printf("它们的最小公约数为:%d\n",p/n);//注/*两数相乘除最大公约数就是最小公倍数*///注意这里是除以公约数
return 0;
}
(20)s(n)=a+aa+aaa+aaa…n为a的位数,类如2+22+222+2222(此时n=4)
int main( )
{
int a,n;
int tn = 0;
int sum = 0;
printf("输入你要输入的数(a,n)");
scanf("%d,%d",&a,&n);
int i=1;
while(i<=n)
{
tn = tn+a;//这一步不能够省略,为哪几个数
sum = sum+tn;//几个数相加
a=a*10;
i++;
}
printf("%d",sum);
return 0;
}
(20)求1!+2!+3!+4!……
int main( )
{
int i=1,j,n=4;//注意n的值
int sum = 1;
int sum1 = 0;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)//这里是<=i
{
sum *=j;//单个数
}
sum1 += sum;//总的数
sum = 1;//注意sum的值要初始化为1
}
printf("%d",sum1);
return 0;
}
(21)求三位数的水仙花数
int main( )
{
int i,bai,shi,ge;
for(i=100;i<1000;i++)
{
bai = i/100;
shi = i/10%10;
ge = i%10;
if(i == (pow(ge,3)+pow(bai,3)+pow(shi,3)))
printf("%d\n",i);
}
return 0;
}
(22)看一个数是不是回文
int main()
{
int num, temp;
int sum=0;
printf("Please input a number:");
scanf("%d", &num);
temp=num;
while(num)
{
sum = sum*10 + num%10;//注意找一个相反的数
num /= 10;
}
if(temp == sum)
printf("yes\n");
else
printf("no\n");
return 0;
}
(22)打印以下的图案
*
***
*****
*******
*****
***
*
//注意一中间的那个作为标准
//找与i的关系
int main()
{int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");//不要忘记
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++) //上下两个相反,注意这里的表达
printf(" ");
for (k=0;k<=4-2*i;k++)
printf("*");
printf("\n");//不要忘记
}
return 0;
}
(23)输出1000内的所有的完数:例如 6的因子为1 2 3. 1+2+3==6
int main( )
{int m,s,i;
for(m=2;m<10000;m++)
{
s=0;
for(i=1;i<m;i++)//注意是<不是等于
if((m%i)==0)s=s+i;
if(s==m)
{
printf("%d,its factors are\n",m);
for(i=1;i<m;i++)//用来输出它的因子
{
if(m%i==0)
printf("%d,",i);
}
printf("\n");
}
}
return 0;
}
(24)有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,……
求出这个数的前20项
int main( )
{
int n = 20;
double a=2,b=1,s,t,i;
for(i=1;i<=n;i++)
{
s = s+a/b;
t = a;
a = a+b;//分子+分母等于下一个分子
b = t;
}
printf("%lf",s);
return 0;
}
(24)猴子吃桃(谭浩强 141)
int peachcount(int n)
{
if(n == 10)
return 1;
else
return (peachcount(n+1)+1)*2;
}
int main( )
{
int count = peachcount(1);
printf("%d",count);
return 0;
}
(25)x sqrt (a) x(n+1)=1/2(x(n)+a/(x(n)),前后两次x的绝对值小于10(-2)谭浩强 141)
int main( )
{
float a,x0,x1;//为浮点型
printf("enter a positive number.");
scanf("%f",&a);
x0=sqrt(a);
x1=(x0+a/x0)/2;
do
{
x0=x1;
x1=(x0+a/x0)/2;//注意这里面的转化方法
}while(fabs(x0-x1)>=1e-5);//理解这里
printf("The square root of %5.2f is %8.5f\n",a,x1);
return 0;
}
int main( )
{
float x1,x2,a;
printf("enter a positive number.");
scanf("%f",&a);
x1 = sqrt(a);
x2 = (x1+a/x1)*(1.0/2);//注意这里必须要有加个.0才行,是浮点型
do
{
x1 = x2;
x2 = (x1+a/x1)*(1.0/2);
}while(fabs(x1-x2)>=1e-5);
printf("The square root of %5.2f is %8.5f\n",a,x2);
return 0;
}
(26)用二分法求2*(x*x*x)-4*(x*x)+3*x-6=0
double sgn(double x){//模拟绝对值函数
if(x > 0)
return x;
else
return -1 * x;
}
double power(double x,int n){//模拟幂函数
double k = 1.0;int i;
if(n > 0){//增长型幂函数
for( i = 0; i < n; i ++){
k = k * x; //特别注意
}
}
else{//衰减性幂函数
for(i = 0; i > n; i --){
k = k / x;//特别注意
}
}
return k;
}
double root(){
double start = 0;//根据题目所要求的根的范围确定起止点
double end = 3.0;
double average = 1.5;//中点
while(1){
double result = 2 * power(average, 3) - 4 * power(average, 2) + 3 * average - 6;
//记录函数结果
if(result > 0)//这个边界的缩小要根据函数变化来判断,result大于零,可能是end缩,也可能是start缩
end = average;
if(result < 0)
start = average;
average = (start + end) / 2.0;
if(result == 0)
return average;
if(sgn(result - 0) < power(10,-3))//确定误差范围
return average;
}
}
int main(){
printf("%.5lf\n", root());
}
(27)求三个字符串中的最大的
int main()
{
char str[3][20];
char string[20];
int i;
for(i=0;i<3;i++)
{
gets(str[i]);
}
if(strcmp(str[0],str[1])>0)
{
strcpy(string,str[0]);//注意通过拷贝
}
else
{
strcpy(string,str[1]);
}
if(strcmp(str[2],string)>0)
{
strcpy(string,str[2]);
}
printf("%s\n",string);
return 0;
}
(28)找出一个二维数组,在该行上最大,在该列上最小
//通过先找出一行中最大的数,再找那个最大数的列里的最小值,
int main( )
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please input matrix:\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]; /*开始时假设a[i][0]最大*/
maxj=0; /*将列号0赋给maxj保存*/
for(j=0;j<M;j++) /*找出第i行中的最大数*/
if(a[i][j]>max)
{
max=a[i][j]; /*将本行的最大数存放在max中*/
maxj=j; /*将最大数所在的列号存放在maxj中*/
}
flag=1; /*先假设是鞍点,以flag为1代表*/
for(k=0;k<N;k++)
if(max>a[k][maxj]) /*将最大数和其同列元素相比*/
{
flag=0; /*如果max不是同列最小,表示不是鞍点令flag1为0*/
continue;
}
if (flag) /*如果flag1为1表示是鞍点*/
{
printf("a[%d][%d]=%d\n",i,maxj,max); /*输出鞍点的值和所在行列号*/
break;
}
}
if(!flag) /*如果flag为0表示载点不存在*/
printf("It is not exist!\n");
return 0;
}
(29)编写如下图形的函数
* * * *
* * * *
* * * *
* * * *
* * * *
//通过先找出一行中最大的数,再找那个最大数的列里的最小值,
int main( )
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<i+5;j++)
{
if(j>=0&&j<i+1)//为了每一行前面能够有空格
printf(" ");
else
printf(" *");//注意加空格
}
putchar(10);
}
return 0;
}
(30)
int main()
{
int a[5]={2,4,6,8,10},*p,**k;
p=a;k=&p;
printf("%d",*(p++));
printf("%d\n",**k);
return 0;
}
2 4(注意p会后面再+1)
(30)将一个整数转化为字符串
void fun(int p)
{
int i = p/10;
if(i != 0)
{
fun(i);
}
printf("%c",p%10+2*'0');//如果不*2注意这里将只会加到数字的地方,要加96
}
int main(void)
{
int zhenshu = 0;
scanf("%d",&zhenshu);
if(zhenshu < 0)
{
printf("-");
zhenshu = -zhenshu;
}
fun(zhenshu);
return 0;
}
(31)求a*x+b*c+c=0的解(109谭浩强)
a=0,不是二次方程
b*b-4*a*c=0,有两个相当的实根
b*b-4*a*c>0,有两个不相当是根
b*b-4*a*c<0,有两个共轭复根
int main()
{
double a,b,c,disc,x1,x2,realpart,imagepart;
scanf("%lf,%lf,%lf",&a,&b,&c);
getchar();
printf("the equation");
if(fabs(a) <= 1e-6)
{
printf("is not a ");
}
else
{
disc = b*b-4*a*c;
if(fabs(disc <= 1e-6))
printf("has two equal roots:%8.4f\n",-b/(2*a));
else
if(disc > 1e-6)
{
x1 = (-b+sqrt(disc)/(2*a));
x2 = (-b-sqrt(disc)/(2*a));
printf("has two root%8.4f and %8.4f\n",x1,x2);
}
else
{
realpart = -b/(2*a);
imagepart = sqrt(-disc)/(2*a);
printf("two \n");
printf("%8.4f+%8.4if\n",realpart,imagepart);
printf("%8.4f-%8.4if\n",realpart,imagepart);
}
}
return 0;
}
(32)求a,b,c三个数的大小
int main()
{
int temp,max;
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
temp = a>b?a:b;//注意这种表方法
max = temp>c?temp:c;
printf("%d\n",max);
return 0;
}
(33)113页12题
int main()
{
double x,y;
scanf("%lf %lf",&x,&y);
int height = 10;
double d1,d2,d3,d4;
d1 = (x-2)*(x-2)+(y-2)*(y-2);
d2 = (x+2)*(x+2)+(y-2)*(y-2);
d3 = (x+2)*(x+2)+(y+2)*(y+2);
d4 = (x-2)*(x-2)+(y+2)*(y+2);
if(d1>1.0 && d2>1.0 && d3>1.0 && d4>1.0)height = 0;
printf("%d\n",height);
return 0;
}
(33)求pi的大小pi/4 = 1-1/3+1/5-1/7……
int main()
{
double term=1.0,sum=0.0,pi,n=1.0;
int sign = 1;
while (fabs(term)>=1e-6)//注意这里是10(-6)的写法
{
sum = sum + term;
n = n+2;
sign = -sign;
term = sign/n;
}
pi = sum*4;
printf("%lf",pi);
return 0;
(34)求Fibonacci数列
int Fib(int n)
{
int F1=1,F2=1,F3,i;
if(n==1)
return F1;
else if(n==2)
return F2;
else
{
for(i=3;i<=n;i++)
{
F3 =F1 + F2;
F1 = F2;
F2 = F3;
}
}
return F3;
}
int main()
{
int n,sum;
scanf("%d",&n);
sum = Fib(n);
printf("%d",sum);
return 0;
}
(35)求(1!+2!+3!……n!),n为输入的值 谭浩强140 6题
int main( )
{
int n;
int i,j,sum = 1,sum1=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum = 1;
for(j=1;j<=i;j++)
{
sum = sum*j;
}
sum1 = sum1+sum;
}
printf("%d",sum1);
return 0;
}
(36)一个球从100m高度自由下落,每次返回一半,在落下,求他在第10次落地时,高度多少,共经过多少米,求第十次返回多高
int main( )
{
double height = 100;
int i = 1;double sum = 100;
while(height>0.0)
{
i++;//注意这里要从2开始,到后面的来回要*2,前面的不用
height = height/2;
sum = sum+height*2;
if(i>10)
break;
}
printf("sum=%lf,height=%lf\n",sum,height);
return 0;
}
(37)
用递归求n阶勒让多项式(219)谭浩强
double PN(double x,int n)
{
if(n==0)
return 1;
else if(n==1)
return x;
else
return ((2*n-1)*x-PN(x,n-1)-(n-1)*PN(x,n-2))/n;//注意这种n的表达方式
}
int main()
{
int n;
double x;
scanf("%lf %d",&x,&n);
printf("%.2f\n",PN(x,n));
return 0;
}
(38) stdlib 头文件 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。
(39)写一个函数,输入一行字符,将字符串中中最长的单词输出
void longword(char s[], char t[]); //定义最长单词函数
int main()
{
char str[30], lg[20];
gets(str); //输入一行字符
longword(str, lg); //调用最长单词函数
puts(lg); //输出最长单词
return 0;
}
//最长单词函数
void longword(char s[], char t[])
{
int i, j, n, k, m, word;
char p[20];
n=strlen(s);
m=0;
word=0;
for (i=0, j=0, k=0; i<=n; i++)//注意,这里的k要放在这里
{
if ((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
{
word=1;
p[j++]=s[i];
}
else if (word==1)//上一次的单词满了结束了,word=1说明了是单词,把这次记录的与上一次作比较
{
if (j>k)
{
for (m=0; m<j; m++)
t[m]=p[m];
t[m]='\0';//不要忘记
k=j;//记录上一次的最长字母的记录
}
word=0;//如果不是单词,就不需要比较,直接在这里初试化
j=0;
}
}
}
(40)习题 7.12 用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
根据牛顿迭代法的公式:
xn+1=xn−f′(xn)f(xn)
f(xn)=ax3+bx2+cx+d
f′(xn)=3ax2+2bx+c
代码块:
double root(double n, double p, double q, double r, double t); //定义求根函数
int main()
{
double x, a, b, c, d;
printf("Please enter coefficient of equation: "); //输入方程系数和附近值
scanf("%lf %lf %lf %lf %lf", &x, &a, &b, &c, &d);
printf("Root=%lf\n", root(x, a, b, c, d)); //输出方程近似根
system("pause");
return 0;
}
//求根函数
double root(double n, double p, double q, double r, double t)
{
double f;
int i;
f=(p*pow(n, 3)+q*pow(n, 2)+r*n+t)/(3*p*pow(n, 2)+2*q*n+r);
for (i=0; fabs(f)>1e-5; i++){
f=(p*pow(n, 3)+q*pow(n, 2)+r*n+t)/(3*p*pow(n, 2)+2*q*n+r);
n-=f;
}
return n;
}
(41) 用递归的办法把一个整数转化成字符串
void convert(int n)
{
int i;
if ((i = n / 10) != 0)
convert(i);
putchar(n % 10 + '0');
}
int main() {
int num;
scanf("%d", &num);
if (num < 0) {
printf("-");
num = -num;
}
convert(num);
printf("\n");
return 0;
}
(42)c语言中16进制转换为十进制
int hexToDec(char *source);
long getIndexOfSigns(char ch);
int main()
{
char* hex = "75BCD15";
printf("16进制数:\t%s\n",hex);
printf("10进制数\t%d\n",hexToDec(hex));
return 0;
}
int hexToDec(char *source)
{
long sum=0;//初始化特别重要
long t=1;
int i,len = strlen(source);//注意这里就这么穿=传,因为从某种意义来说他就是个字符串常量
for(i=len-1; i>=0; i--)
{
sum += t * getIndexOfSigns(*(source + i));
t *= 16;
}
return sum;
}
long getIndexOfSigns(char ch) //把要传的数转化
{
if(ch>='0' && ch<='9')
return ch-'0';
if(ch>='A' && ch<='F')
return ch-'A'+10;
if(ch>='a' && ch<='f')
return ch-'a'+10;
return -1;
}
(43)输入一行文字,找出其中的大写字母。小写字母,空格,数字以及其他字符各有多少?
int main()
{
char a[30];//注意这种表示方法,用指针
char *p;
int i=0,j=0,m=0,n=0,k=0;
p=a;
printf("请输入一段文字:\n");
gets(a);
while(*p!='\0') //当字符不为结束符时,执行操作
{
if(*p>='A'&&*p<='Z')
{i++;}
else if(*p>='a'&&*p<='z')
{j++;}
else if(*p>='0'&&*p<='9')
{m++;}
else if(*p==' ')
{n++;}
else
{k++;}
p++; //执行完一轮后,将指针的地址指向下一个字符,继续检查
}
printf("大写字母:%d\n小写字母:%d\n数字:%d\n空格:%d\n其他字符:%d\n",i,j,m,n,k);
return 0;
}
自己写的
int main()
{
char str[1024]={0};
printf("请输入一段文字\n");
gets(str);//这里用scanf的话不行
int i=0,len=strlen(str);
int count1,count2,count3,count4,count5;
count1=count2=count3=count4=count5=0;
for(i=0;i<len;i++)
{
if(str[i]>='A' && str[i]<='Z')
count1++;
if(str[i]>='a' && str[i]<='z')
count2++;
if(str[i]>='0' && str[i]<='9')
count3++;
if(str[i]=='32')
count4++;
else
count5++;
}
printf("大写字母:%d 小写字母:%d 数字:%d 空格%d 其他的字母:%d\n",count1,count2,count3,count4,count5);
return 0;
}