1.一个整数,它加上100后是完全平方数,再加168又是完全平方数,求该数。(数字小于10000)
思想:for循环,用int型变量x,y记录平方根,再平方回去,看是否还等于原来的(利用了int型变量自动取整,若是完全平方数,平方根就是整数,不会被舍弃小数部分而不等于原来的)
#include <stdio.h>
#include <math.h>
int main(){
int i,x,y;
for (i=-100;i<10000;i++){//加上100是完全平方数,所以从-100开始(负数不可能是完全平方数)
x=sqrt(i+100);
y=sqrt(i+168);
if(x*x==(i+100)&&y*y==(i+168)){
printf("%d",i);break;}
}
return 0;
}
2.用递归法将一个整数n转换为字符串输出
思想:如:数字3转换为字符3怎么换?当然是3+‘0’再以字符格式输出啦!
#include <stdio.h>
void tochar(int n);
int main() {
int n;
scanf("%d", &n);
if (n < 0) {
printf("-");//若是负数则提前输出-再转换为正数
n = -n;
}
tochar(n);
return 0;
}
void tochar(int n) {
int i;
if ((i=n/ 10 )!= 0) {
tochar(i);
}
putchar(n % 10 + '0');//转换为字符输出 ,递归,个位最后输出
}
3.计算n!是很难的事实上n=20,计算机的长整型就以及放不下了(事实上可以数组存储很好的解决这个问题,我前面的博客有),但是我们可以用一个程序来编写程序来算出n!的最后一位非0的数。
思想:为了避免数值过大溢出,并且只要求要最后一个非0的数,若我们得到一个结果567000,我们知道要的是7,且后续继续计算阶乘,前面的56与后面的0不会影响到后续阶乘的结果最后一个非0的数。因此每算一次sum就取出最后一次非0的数,这样就完全不会数值溢出了!
#include <stdio.h>
int main() {
int n,i,s=1;
scanf("%d", &n);
for(i=1;i<=n;i++){
s*=i;
while(s%10==0){
s/=10;//去除后面的0
}
s%=10;//去除前面的,除了最后一位非0的数
}
printf("%d",s);
}