Spiral Matrix 螺旋矩阵
#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
#include<math.h>
int main() {
int number,i,j;
printf("input one perfect square:\n");
scanf("%d",&number);
int side=sqrt(number);
int spiralMatrix[side][side];
//Spiral Matrix
//设定4个边界
int top=0,bottom=side-1,left=0,right=side-1;
int value=1;
while(top<=bottom&&left<=right)
{
//从左到右移动
for(i=left;i<=right;i++)
{
spiralMatrix[top][i]=value++;
}
top++;
//从上到下移动
for(i=top;i<=bottom;i++)
{
spiralMatrix[i][right]=value++;
}
right--;
if(top<=bottom)
{
for(i=right;i>=left;i--)
{
spiralMatrix[bottom][i]=value++;
}
bottom--;
}
if(left<=right)
{
for(i=bottom;i>=top;i--)
{
spiralMatrix[i][left]=value++;
}
left++;
}
}
for(i=0;i<side;i++)
{
for(j=0;j<side;j++)
{
printf("%d",spiralMatrix[i][j]);
if(j!=side-1)printf(" ");
}
printf("\n");
}
return 0;
}
Bubble Sort & Selection Sort 冒泡排序与选择排序
Bubble Sort 冒泡排序
n个数比较n-1次,每次比较n-1-i个数,每次两两相邻比较,每次将剩余的n-i个数中最大的放在最右边
#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
#include<math.h>
void bubbleSort(int arr[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main() {
int n,i;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
//Bubble Sort
bubbleSort(arr,n);
//output sorted array
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
Selection Sort 选择排序
次数与冒泡排序一样,每次将在所有未排序的n-i个数中,选出最小/大的数放在排序的起始位置
void selectionSort(int arr[],int n)
{
int i,j,temp,minIdx;
for(i=0;i<n;i++)
{
//每次循环都把最小的数放在i处
minIdx=i;
for(j=i+1;j<n;j++)//j从i+1开始循环
{
if(arr[minIdx]>arr[j])minIdx=j;
}
//交换min与当前i的位置
if(minIdx!=i)
{
temp=arr[i];
arr[i]=arr[minIdx];
arr[minIdx]=temp;
}
}
}
Find the greatest commom divisor 求最大公约数
欧几里得算法(Euclidean algorithm)/辗转相除法
较大数a除以较小数b得一余数r,若r为0,则两数最大公约数为b,若r不为0,则令a=b,b=r,再重复上述过程直至余数为0,此时的b即为最大公约数GCD
//function declaration
int gcd(num1,num2);//greatest common divisor
int main(int argc, char *argv[]) {
int num1,num2,result;
scanf("%d%d",&num1,&num2);
result=gcd(num1,num2);
printf("%d\n",result);
return 0;
}
//function definition
int gcd(int a,int b)
{
while(b!=0)
{
int temp=b;
b=a%b;
a=temp;
}
return a;
}
for循环法
先找出两数中的较小数并存放在min中,且gcd(greatest common divisor,最大公约数)一定<=min,for循环从1到min,当两数%i都为0时,i即为最大公约数
int main() {
int num1,num2,i;
int min=0,gcd=1;//greatest common divisor
scanf("%d%d",&num1,&num2);
min=(num1<num2)?num1:num2;//min存放较小的数
for(i=1;i<=min;i++)
{
if(num1%i==0&&num2%i==0)
{
gcd=i;
}
}
printf("%d\n",gcd);
return 0;
}
求一定范围内的质数个数
//求某范围内质数个数 start and end are excluded
int isPrime(int num);
int main() {
int start,end,count=0;
int i,j;
scanf("%d%d",&start,&end);
for(i=start+1;i<end;i++)
{
if(isPrime(i))count++;
}
printf("%d\n",count);
return 0;
}
//isPrime函数中条件顺序不能乱
int isPrime(int num)
{
if(num<=1)return 0;//1和负数不是质数
if(num==2)return 1;
if(num%2==0)return 0;//除2之外的偶数不是质数
//只检查奇数
int j;//因数从3到num的平方根
for(j=3;j<=sqrt(num);j+=2)//只判否,有一个因数就返回0
{
if(num%j==0)return 0;
}
return 1;
}
打印
*金字塔
void starsPrint(int n)
{
int i,j,k;
for(i=1;i<=n;i++)//循环n次
{
int stars=2*i-1;
//打印空格,第n个打印0个空格
for(j=0;j<n-i;j++)
{
printf(" ");
}
//打印*
for(k=0;k<stars;k++)
{
printf("*");
}
//enter
printf("\n");
}
}
int main() {
int number;
scanf("%d",&number);
starsPrint(number);
return 0;
}
数字金字塔
for(i=1;i<=n;i++)//循环n次
{
//打印空格,第n个打印0个空格
for(j=0;j<n-i;j++)
{
printf(" ");
}
//打印数字,得分两次循环
for(k=1;k<=i;k++)
{
printf("%d",k);
}
for(k=i-1;k>0;k--)
{
printf("%d",k);
}
//enter
printf("\n");
}
Fibonacci sequence 斐波那契数列
以1,1,2,3,5,开头,从第3个数开始,每个数都等于前两个数之和
递归(效率较低)
//fibonacci函数,递归:每一项都来自于上几项
int fibonacci(int n)
{
if(n<=1)return n;
else return fibonacci(n-1)+fibonacci(n-2);
}
int main() {
int fiboArray[30]={0};
int i;
//assignment
for(i=0;i<30;i++)
{
fiboArray[i]=fibonacci(i);
}
//output the top 30 items
for(i=0;i<30;i++)
{
if(i!=0&&i%5==0)printf("\n");
printf("%8d ",fiboArray[i]);
}
printf("\n");
return 0;
}
迭代
//递归法求斐波那契数列,只要分<=1和else即可
//迭代比递归效率更高,可以避免运行不必要的程序
int main() {
int fiboArray[30];
int a=1,b=1;
int i,temp;
//迭代计算fibonacci数列前30项
for(i=0;i<30;i++)
{
fiboArray[i]=a;
temp=a+b;
a=b;
b=temp;
}
//分组对齐输出
for(i=0;i<30;i++)
{
if(i%5==0&&i!=0){
printf("\n");
}
printf("%8d",fiboArray[i]);
}
printf("\n");
return 0;
}
找到数组中的MAX和min
#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
//找到int能表示的最小数和最大数
#include<math.h>
int main() {
int n,i;
scanf("%d",&n);
//judgment statement
if(n<=0||n>100)
{
printf("The input number should be between 0 and 100!");
return 1;//Jump out of the program
}
int arr[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int max=INT_MIN;//最大值初始化为int能表示的最小值
int min=INT_MAX;
for(i=0;i<n;i++)
{
//循环n次,每次更新max和min的值
if(arr[i]>max)
{
max=arr[i];
}
if(arr[i]<min)
{
min=arr[i];
}
}
printf("%d %d\n",max,min);
return 0;
}
水仙花数(153 370 371 407)
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数(严格来讲水仙花数只是自幂数的一种)、阿姆斯壮数或阿姆斯特朗数(Armstrong number)。
水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身
//统计1~1000内的水仙花数并输出
//153 370 371 407
int isTrue(int num)
{
int g,s,b;
g=num%10;
b=num/100;
s=(num%100)/10;
if(g*g*g+s*s*s+b*b*b==num)return 1;
return 0;
}
int main() {
int i,count=0;
for(i=100;i<1000;i++)
{
if(isTrue(i))
{
printf("%d ",i);
count++;
}
}
printf("\n%d\n",count);
return 0;
}
319

被折叠的 条评论
为什么被折叠?



