问题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} 4a−2+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;
}