欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言程序设计基础篇(简单算法) 大一新生颤颤巍巍作

程序员文章站 2022-07-15 08:46:23
...

目录

前言

               1、Hello world!

               2、分段函数

      3.从1加到n的累加计算(运用for循环,用变量sum保存累加的和)

      4.累加变式改变符号做运算(for循环基础,符号变换)

 5.阶乘(for循环)简单阶乘 n!

 6.1001 害死人不偿命的(3n+1)猜想 Pat乙级

总结



前言

刚刚大一,入学不到一个月,有很多问题,用博客记录下来慢慢发酵

为了巩固新学的知识和完善自己的基础简单算法特写此篇望指正

一些例题出自学校OJ和学校发的C语言程序设计(何钦铭著)

1、Hello world!

这是我接触的第一门语言c,从这里开始Hello world!

#include<stdio.h>
int main(){
printf("Hello world!\n");	
return 0;
}

2、分段函数

               为鼓励居民节约用水,自来水公司采取用水量按月分段计费的办法。居民应交水费y(元)与月用水量x(吨)的函数表达式如下(设x>=0)。输入用户的月用水量x(吨),计算并输出该用户应支付的水费y(元)(保留两位小数) 4*x/3     x<=15

      y=f(x)={

                2.5x-10.5  x>15

#include<stdio.h>
int main(){
double  x,y;//double 是双精度浮点型变量,有着与float比较占用空间更大,精度更高,取值范围更大的特点 
printf("Enter x= \n");//"\n"特殊字符(换行) 
scanf("%lf",&x);//double型数据使用格式控制说明是"%lf",注意l是long的首字母 
/*lf - else 语句*/
if(x<=15){
    y=4*x/3;
}else{
    y=2.5*x-10.5;
}
printf("y=f(%f)=%.2f\n",x,y);//double型数据输出格式控制说明是"%f",%.2f中.2是表示保留两位小数 

return 0;
}

3.从1加到n的累加计算(运用for循环,用变量sum保存累加的和)

 

#include<stdio.h>
int main(){
   int n,sum;
 
      printf("Enter=");
      scanf("%d",&n);
    sum=0;                   //设置了一个储存空间,让i循环累加的值保存下来,初始值清零
 
for(int i=1;i<=n;i++){      /*循环次数为 n 次,让i从1一直自加到数值跟n相等为止,
                             for循环在满足i<=n这个条件下循环*/                              
     sum+=i;                 //相当于sum=sum+i;意思是sum加上i的值再赋给sum 
 }
printf("Sum of numbers from 1 to %d is %d\n",n,sum);
 
return 0;
}

4.累加变式改变符号做运算(for循环基础,符号变换)

  与累加的差不多区别就在于符号有波动变换

#include<stdio.h>
int main(){
   int n,flag;
double sum,m;          //双精度浮点型变量
      printf("Enter="); 
      scanf("%d",&n);
      
sum=0;flag=1; m=1;       
  for(int i=1;i<=n;i++){  
     sum+=m;           //sum=sum+m 
     flag=-flag;       //符号转换      
     m=flag*1.0/(i+2); //为下一次跟sum相加做准备,i参与到运算中    
 }
     printf("sum=%f\n",sum);
    return 0;
}

 5.阶乘(for循环)简单阶乘 n!

 和累加差不多都是通过for循环累计相乘

#include<stdio.h>
int main(){
   int n,sum;
 
      printf("Enter = ");
      scanf("%d",&n);
    sum=1;               //注意sum的初始值为1 
for(int i=1;i<=n;i++){      
sum*=i;                    //与从1加到n很像,每次sum与i的乘积赋给sum,做循环,i自加加到n 
 }
printf("从%d乘到1(阶乘)sum= %d\n",n,sum);

return 0;
}

 

 6.1001 害死人不偿命的(3n+1)猜想 Pat乙级

注:题目出自于Pat如果有任何违规请留言,放在这里仅供参考,不用作商业用途,望理解谢谢!

外加一道Pat乙级这道题是用c++写的,对于我初学来说区别还是很大的,如果有任何意见麻烦留言谢谢!

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

#include<iostream>
#include<cmath>

 using namespace std;
 int main(){
int a;
cin>>a;
int i=0;

while(a>1){
	if(a%2==0){
	  a/=2;
	}
	else a=(3*a+1)/2;
	i++;
	
}
cout<<i;

}

 


总结

这二十天的学习,让我知道网络技术这个深不见底的知识海洋有多广,目前系统知识缺的太多,专业知识太少,只能慢慢补充,以上如果有任何错误望指正,如果你有什么好的建议或者想法请留言!这段时间争取把这本书上所有关于简单算法的一些意识方法都放在这个栏目中,留做以后巩固基础时候看,为大厂而奋斗!