前言
级数和本来并不难,但是老师给出的代码比我自己写的优化太多;幂数膜则是同学用了逻辑运算符,所以忍不住还是来记录一下。
一、级数和
这是我的代码(太长了就别看了)
#include <stdio.h>
int main(){
int n = 0;
scanf("%d",&n);
int i = 1;
float j = 0,k = 0;
if(n<9){
while(i<n){
j = i + (i + 1)/10.0; //输入打印部分
printf("%.1f+",j); //输入打印部分
j = 0;
k = k + i + (i + 1)/10.0; //计算部分
i++;
}
if(i==n){
j = i + (i + 1)/10.0;
printf("%.1f",j);
k = k + i + (i + 1)/10.0; //计算部分
}
printf("=%.2f",k);
}
if(n==9){
while(i<n){
j = i + (i + 1)/10.0; //输入打印部分
printf("%.1f+",j); //输入打印部分
j = 0;
k = k + i + (i + 1)/10.0; //计算部分
i++;
}
if(i==n){
j = i + (i + 1)/10.0;
printf("%.1f",j);
k = k + i + (i + 1)/10.0; //计算部分
}
printf("=%.2f",k);
}
if(n>=9 && n<99){
while(i<9){
j = i + (i + 1)/10.0; //输入打印部分
printf("%.1f+",j); //输入打印部分
j = 0;
k = k + i + (i + 1)/10.0; //计算部分
i++;
}
while(i>=9 && i<n){
j = i + (i + 1)/100.0;
printf("%.2f+",j);
j = 0;
k = k + i + (i + 1)/100.0;
i++;
}
if(i==n){
j = i + (i + 1)/100.0;
printf("%.2f",j);
j = 0;
k = k + i + (i + 1)/100.0;
}
printf("=%.2f",k);
}
if(n==99){
while(i<9){
j = i + (i + 1)/10.0; //输入打印部分
printf("%.1f+",j); //输入打印部分
j = 0;
k = k + i + (i + 1)/10.0; //计算部分
i++;
}
while(i>=9 && i<n){
j = i + (i + 1)/100.0;
printf("%.2f+",j);
j = 0;
k = k + i + (i + 1)/100.0;
i++;
}
if(i==n){
j = i + (i + 1)/1000.0;
printf("%.2f",j);
j = 0;
k = k + i + (i + 1)/1000.0;
}
printf("=%.2f",k);
}
return 0;
}
结果9.1还打成9.10了,更是心态爆炸
下面是老师的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int a=2;
double b=3,sum=1.2;//不论n等于多少,1.2始终都需要打印。减少一次循环
scanf("%d",&n);
printf("1.2");
while (a<=n)//相当于把n=1踢出去
{
if (a<9)//而非a<=9,避免出现9.10
{ sum+=a+b/10;
printf("+%lg",a+b/10);
}
else if(a<99)
{
sum+=a+b/100;
printf("+%lg",a+b/100);
}
a++,b++;
}
printf("=%.2lf",sum);
return 0;
}
输了呜呜呜
另外在这里分享一下%lg的用法(因为之前一直没用过):
%g与%lg是以十进制和指数中较短形式分别输出float,double型小数
同时,%lg还有别的用处
可以看到,在对1.1分别使用%lg和%f输出时,%lg对末尾0进行了省略。
这就意味着,在本题中如果用%lg,就可以避免考虑9.10,99.100这样的情况。
(ps:这里的%lg的原理作用是我自己的实验试出来的,可能有纰漏,欢迎指正)
二、幂数膜
先上我的
#include<stdio.h>
int pow(int a, int b) {
int s = 0;
if (b != 0) {
for (s = a; b > 1; b--)
s *= a;
return s;
}
else
return 1;
}
int main() {
int a = 0, b = 0;
long long m = 0;
scanf("%d%d%lld", &a, &b, &m);
printf("%lld", pow(a, b) % m);
return 0;
}
再看看同学的
#include<stdio.h>
int main()
{
long long a,b,m,t = 1;
scanf("%lld %lld %lld",&a,&b,&m);
while(b != 0)
{
if(b & 1)
t = (t * a) % m;
a = (a * a) % m;
b >>= 1;
}
printf("%lld",t);
return 0;
}
————————————————
版权声明:本文为CSDN博主「二分之无丌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_71919496/article/details/133515219
原理
对于任意一个幂函数的次数,将其表示为二进制后,如: