做PTA中M2021秋C、Java入门练习相关记录

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;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值