7-25
本想着按照7-24参考别人的方法,利用 while(1)里写scanf的方式完成,代码如下:
#include <stdio.h>
int main(){
int sum,n,o;
sum = 0;
while(1){
scanf("%d",&n);
if(n<=0){
return 0;//改为break则正确
}else if(n % 2 == 1){
sum += n;
}
}//whlie
printf(" %d",sum);
}
j结果最后不会输出sum,将return 0换为 break,结果正确。思考return 0是return给谁?while(1)利用的是scanf每次输入默认返回输入值个数,本意是用return 0 代替scanf的返回值,结果好像直接return 0 了main函数,因为跨考基础不是很扎实,过后再仔细查询一下。
7-27 兔子繁殖问题
#include<stdio.h>
int main(){
int t,i = 1,mon = 2,sum = 1,N;
scanf("%d",&N);
if(N==1){
printf("1");
}else {
while(sum < N){
mon++;
t = i;
i = sum;
sum = sum +t;
}
printf("%d",mon);
}
return 0;
}
重点:兔子的个数变化是斐波那契数列,及f3=f2+f1;本月数量等于前两月兔子数量之和。
注意mon要赋值2;
此题还可用递归算法,有待补充,思路即前两个月给出值f1 = 1; f2 =1 ;f(n)= f(n-1) + f(n-2);
7-28 求整数的位数及各位数字之和 (15 分)
看到题目,第一反应分别除列个数组存次方,循环里面做除法,再相加即可,有如下代码
#include <stdio.h>
int main(){
int sum = 0,N,i= 9,num = 0;
int a[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
scanf("%d",&N);
for(i;i>=0;i--){
if(N/a[i] != 0){
num++;
//sum += (N/a[i]);初次自己想法,想错
sum += n%10;
N=N/10;
}
}
printf("%d %d",num,sum);
return 0;
}
写到求和发现不对,每次无法让他自动减小,参考他人,有了每次缩小十倍,开始写为每次除法相加,没理解透彻,应该取余。
改完后发现数组完全多余,以下为参考的他人简单版本,本题思考过于复杂化。
#include <stdio.h>
int main(){
int n, count, sum;
sum = 0;
count = 0;
scanf("%d", &n);
while(n!=0){
count++;
sum += n%10;
n /= 10;
}
printf("%d %d\n", count, sum);
return 0;
}
7-29 二分法求多项式单根 (20 分)
本题为二分查找的变型,个人觉得较难,于是参考他人答案:PAT C入门题目-7-29 二分法求多项式单根 (20 分)_Scarlett-优快云博客
自己原本打算封装好直接使用,结果不对,因较晚,故在此记录,下次解决。
#include <stdio.h>
double a3, a2, a1, a0;
double calculate(double x) {
return a3 * x*x*x + a2 * x*x + a1 * x + a0;
}
int BinarySearch(double a,double b){
double low, high,mid;
low = a, high = b;
while(high - low >= 0.01){
mid = (low +high)/2;
if(calculate(mid) == 0)
return mid;
else if (calculate(low)*calculate(mid) >= 0) {
a = mid;
}//if
else {
b = mid;
}//else
if (high - low < 0.01) {//可理解为两数相等
return mid;
}//if
}//while
}
int main(void) {
double a, b, mid;
scanf("%lf %lf %lf %lf", &a3, &a2, &a1, &a0);
scanf("%lf %lf", &a, &b);
/*while (b - a >= 0.01) {
if (calculate((a + b) / 2) == 0) {
result = (a + b) / 2;
break;
}
if (calculate(a) == 0) {
result = a;
break;
}
if (calculate(b) == 0) {
result = b;
break;
}
if (calculate(a)*calculate((a + b) / 2) >= 0) {
a = (a + b) / 2;
}
else {
b = (a + b) / 2;
}
}
if (b - a < 0.01) {//可理解为两数相等
result = (a + b) / 2;
}*/
BinarySearch(a,b);
printf("%.2f\n", mid);
return 0;
}
7-31 掉入陷阱的数字 (15 分)
思路:7-28做过求各位数字之和,在最后加上 sum*3+1,将其封装为sum1函数,用在循环中,设i记录次数,t保存上一个sum作判断来跳出循环。
看了其他思路,因为求sum本身就有循环,所以直接在里面用更简单。
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
for(int i = 1; ; i++){
int sum = 0, m,t;
t = n;
while(n>0){
sum += n % 10;
n /= 10;
}
m = t;
n = sum * 3 + 1;
printf("%d:%d\n", i, n);
if(m == n) break;
}
return 0;
}
7-32 求交错序列前N项和 (15 分)
很简单,i/i*2-1 用if来判断i为奇数加,偶数减:
#include <stdio.h>
int main(){
int i,n;
float sum;
scanf("%d",&n);
for(i = 1;i <= n;i++){
if((i % 2) == 1){
sum += i/(2*i - 1.000);
}else sum -= i/(2*i - 1.000);
}
printf("%.3f",sum);
return 0;
}