《算法笔记》Codeup练习 5.1小节 简单数学问题

问题A 守形数

题目大意
给一个整数N(2≤N<100),判断N平方后的数的地位部分是否为N。
例: 2 5 2 25^2 252=625,低位部分是25,则25是守形数。

思路
首先得出N的位数w,接着用N对 1 0 m 10^m 10m求余,判断余数是否等于N。

代码

#include <iostream>
#include<stdio.h>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;

int weishu(int n){
    int k=1;//标记n的位数
    while(n){
        if(n/10!=0){
            k++;
        }
        n=n/10;
    }
    return k;
}

int main(int argc, const char * argv[]) {
    int n;
    while(scanf("%d",&n)!=EOF){
        int square=n*n;
        int ten=pow(10, weishu(n));
        if(square%ten==n){
            printf("Yes!\n");
        }
        else{
            printf("No!\n");
        }
    }
    return 0;
}

问题B 反序数/问题I 反序相等

题目大意
一个四位数N,它的9倍刚好是它的反序数,求满足与反序数存在9倍关系的所有N的值。
反序数的概念:1234的反序数4321

思路
对四位数进行遍历,将4位数的各数位逆序存入数组,接着将数组内的数转化为int型的数值,再进行判断是否存在9倍关系。

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

//逆序存到数组里
void to_array(int n,int A[]){
    for(int i=0;i<4;i++){
        A[i]=n%10;
        n=n/10;
    }
}

//将数组里面的数专为int数值
int to_num(int A[]){
    int num=0;
    for(int i=0;i<4;i++){
        num=num*10+A[i];
    }
    return num;
}

int main(int argc, const char * argv[]) {
    for(int i=1000;i<10000;i++){
        int A[4];
        to_array(i, A);
//        for(int j=0;j<4;j++)
//            printf("%d ",A[j]);
//        printf("%d\n",to_num(A));
        if(i*9==to_num(A)){
            printf("%d\n",i);
        }
    }
    return 0;
}

问题C 百鸡问题

题目大意
用n元去买100只鸡。有5元/只、3元/只、 1 3 {1\over3} 31元/只的三种价格的鸡,分别买x,y,z只。求解所有满足的x,y,z的值。

思路
x+y+z=100;
5x+3y+ z 3 {z\over3} 3z≤n;
x,y,z∈ Z + Z_+ Z+
建立双重循环,对x从0开始循环,限制条件是≤ n 5 n\over5 5n;内层对y从0开始循环,限制条件是≤100-x;循环内部z=100-x-y直接使满足百只鸡的条件,之后再判断钱够不够。

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int n;
    int x,y,z;
    double sum;
    while(scanf("%d",&n)!=EOF){
        sum=0;
        for(x=0;x<=n/5;x++){
            for(y=0;y<=100-x;y++){
                z=100-x-y;
                sum=5*x+3*y+(z*1.0)/3;
                if(sum<=n)
                    printf("x=%d,y=%d,z=%d\n",x,y,z);
            }
        }
    }
    return 0;
}

问题D abc/问题G 加法等式

题目大意
两个三位数分别为abc、bcc,并且abc+bcc=532,求所有满足条件的a、b、c。

思路
因为两个数都是三位数,所以a和b肯定不等于0
三重循环遍历验证

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int a,b,c;
    int num1,num2;
    for(a=1;a<10;a++){
        for(b=1;b<10;b++){
            for(c=0;c<10;c++){
                num1=a*100+b*10+c;
                num2=b*100+c*10+c;
                if(num1+num2==532)
                    printf("%d %d %d\n",a,b,c);
            }
        }
    }
    return 0;
}

问题E 众数

题目大意
找出20个数中出现次数最多的数,若有多个众数,则输出值最小的那个。

思路
用结构体,结构体属性有值和次数。
输入完成后,对结构体按照次数从多到少进行排序(次数一样的按照值从小到大排序)
最后输出第一个值即可。

过程中犯的错误
忽略了题目要求的多组测试数据

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

struct number{
    int value;
    int count=0;
};

bool cmp(number x,number y){
    if(x.count==y.count)
        return x.value<y.value;
    else
        return x.count>y.count;
}

int main(int argc, const char * argv[]) {
    number num[11];
    int n;
    while (scanf("%d",&n)!=EOF){//不可以写while(true)
        for(int i=1;i<11;i++){
            num[i].value=i;
            num[i].count=0;
        }
        num[n].count++;
        for(int i=1;i<20;i++){
            scanf("%d",&n);
            num[n].count++;
        }
        sort(num+1,num+11,cmp);
        printf("%d\n",num[1].value);
    }
    return 0;
}

问题F 计算两个矩阵的乘积

题目大意
计算一个23矩阵与一个32矩阵的乘积

思路
两个2维数组存数据,循环计算。

过程中犯的错误
循环计算的变量逻辑没有理清楚,导致计算错误。

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int matrix1[2][3];
    int matrix2[3][2];
    int n;
    while(scanf("%d",&n)!=EOF){
        int res[2][2]={0};
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
                if(i==0&&j==0)
                    matrix1[i][j]=n;
                else
                    scanf("%d",&matrix1[i][j]);
            }
        }
        for(int i=0;i<3;i++){
            for(int j=0;j<2;j++){
                scanf("%d",&matrix2[i][j]);
            }
        }
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int k=0;k<3;k++)
                    res[i][j]=res[i][j]+matrix1[i][k]*matrix2[k][j];
            }
        }
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                printf("%d ",res[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

问题H 整数和

题目大意
给一个整数N,当N为非负数,计算N到2N的和;当N为负数,计算2N到N的和。

思路
整数求和公式,负数时先当做整数求,最后加个负号。
注意:项数是N+1,不是N。

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int m,N;
    scanf("%d",&m);
    while(m--){
        scanf("%d",&N);
        if(N>0){
            printf("%d\n",3*N*(N+1)/2);
        }else{
            printf("%d\n",-3*(-N)*(-N+1)/2);
        }
    }
    return 0;
}

问题J 多项式的值

题目大意
给出一个多项式从0次到n次的各项系数,以及自变量x的值,求解最后的值。

思路
数组存储系数,循环相乘求和,依次给x升次。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int m,n,x;
    scanf("%d",&m);
    while (m--) {
        scanf("%d",&n);
        int factor[11]={0};
        for(int i=0;i<=n;i++)
            scanf("%d",&factor[i]);
        scanf("%d",&x);
        int pow=1;
        int sum=0;
        for(int i=0;i<=n;i++){
            sum+=factor[i]*pow;
            pow*=x;
        }
        printf("%d\n",sum);
    }
    return 0;
}

问题K 迭代求立方根

题目大意
已知迭代方程,给出x的值以及迭代n次,求迭代后的结果。

思路
循环求值。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;


int main(int argc, const char * argv[]) {
    double x;
    int n;
    while (scanf("%lf%d",&x,&n)!=EOF) {
        double y=x;
        for(int i=1;i<n+1;i++){
            y=y*2/3+x/(3*y*y);
        }
        printf("%.6lf\n",y);
    }
    return 0;
}

问题L 与7无关的数

题目大意
给定n(n<100),求(0,n]之间既不是7的整数倍,各个数位上也没有7的数的平方和。

思路
对(0,n]进行循环遍历,满足条件的即平方求和,最后得到结果。
或者先将(0,100)之间所有与7无关的数都标记出来,之后循环平方求和。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

int A[100];

void seven(int A[]){
    for(int i=0;i<100;i++){
        if(i%7==0||i/10==7||i%10==7){
            A[i]=0;
        }else{
            A[i]=1;
        }
    }
}

int main(int argc, const char * argv[]) {
    int n;
    int sum;
    seven(A);
    while(scanf("%d",&n)!=EOF){
        sum=0;
        for(int i=0;i<n+1;i++){
//            if(i%7!=0&&i%10!=7&&i/10!=7){
//                sum+=i*i;
//            }
            if(A[i]){
                sum+=i*i;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

问题M 鸡兔同笼

题目大意
已知共有a只脚,求最多有多少动物,最少有多少动物。

思路
当a是奇数时,肯定不可能;
当a是偶数时,

  • 最多的情况肯定都是鸡,也就是 a 2 {a\over2} 2a只;
  • 最少的情况(理想化地)都是兔,这就存在一个a是否是4的整数倍的问题。
    (这里a已经是个偶数了,所以a%4只有0和2两种情况)
    所以再分两种情况,当a%4=0时,最少有 a 4 {a\over4} 4a只;当a%4=2时,有一只鸡,剩下全是兔,即最少有 a − 2 4 {a-2\over4} 4a2+1只。

代码

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {
    int n,a;
    int max,min;
    scanf("%d",&n);
    while(n--){
        max=0;
        min=0;
        scanf("%d",&a);
        if(a%2!=0)
            printf("%d %d\n",min,max);
        else{
            max=a/2;
            if(a%4==2)
                min=(a-2)/4+1;
            else
                min=a/4;
            printf("%d %d\n",min,max);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值