函数题
6-1 亲和数
思路:分别求出num1,num2的所有约数之和,判断是不是互相相等
int sum_dividor(int num){//求num这个数各个约数的和
int re=0;
for(int i=1;i<num/2+1;i++){//遍历1~num/2+1
if(num%i==0){//找到约数
re+=i;//加到总和中
}
}
return re;
}
int isAmicable(int number1 , int number2 ){
int sum1=sum_dividor(number1);//number1约数
int sum2=sum_dividor(number2);//number2约数
if(sum1==number2&&sum2==number1){//是
return 1;
}
else{//否
return 0;
}
}
6-2 数字重组
思路:根据position将数字拆分成三部分,重新组合
long long recombination(long long num , int position)
{
long long re=0;//结果变量
long long first=0,second=0,third=0;//first,second,third为num的三个部分
long long se_div=1,th_div=1;//取出第二部分、第三部分需要用到的工具变量
int num_length=0;//位数
//获得num的位数
long long temp=num;
while(temp!=0){
num_length++;
temp/=10;
}
//获得取出第二部分、第三部分需要用到的工具变量
int div_length=num_length-position;
for(int i=1;i<=div_length;i++)
{
th_div*=10;
}
se_div=th_div*10;
//数据分割
second=num%se_div;
first=num-second;//第一部分
third=num%th_div;//第三部分
second=(second-third)/th_div;//第二部分
//数据重组
re=first+third*10+second;
return re;
}
编程题
7-1 算数
思路:运算倒退,计算顺序是:(x*3-5)*3-5……=m,则倒退计算(m+5)/3重复n次得到原始值
#include<stdio.h>
int main(){
int n,m;//重复次数,最终结果
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){//0~n-1,计算n次
m=(m+5)/3;//m每一次更新,最终存储原始值
}
printf("%d",m);
return 0;
}
7-2 多少个一
思路:穷举1,11,111,……,直到找到n的倍数
#include <stdio.h>
int main()
{
int n,count = 1;
long long beishu = 1;
scanf("%d", &n);
while(beishu%n!=0){//不是n的倍数
beishu=beishu*10+1;
count++;//位数+1
}
printf("%d",count);
return 0;
}
7-3 棋盘
思路:归纳数学规律,总的子棋盘数和正方形数量比较好求,求这两个来得到长方形的数量。
难点:数学规律归纳。
总的子棋盘数:长有1到m种情况,宽有1到n种情况。
正方形数量:根据正方形边长的情况和每种情况的数量来归纳总结。
#include<stdio.h>
int main()
{
int m;//短边
int n;//长边
scanf("%d %d",&m,&n);
int temp=0;
if(n<=m)
{
temp=n;
n=m;
m=temp;
}//保证m<n
int sum=m*(m+1)/2*n*(n+1)/2;//总共有的子棋盘数
//1+2+……+m
//1+2+……+n
int tri=0;//正方形数量
for(int i=0;i<m;i++){
tri+=(m-i)*(n-i);
}
printf("%d %d",tri,sum-tri);//长方形数量=总子棋盘数-正方形数量
return 0;
}