//
// main.c
// 算法入门2
//
// Created by tarena on 15/5/28.
// Copyright (c) 2015年 com.tarena.wanq. All rights reserved.
//
#include <stdio.h>
/* 题目0
*/
void func();
void func()
{
}
/* 题目1
位数(digit)
输入一个不超过10的9次方的正整数,输出它的位数。
*/
void digit();
void digit()
{
int num,i;
scanf("%d",&num);
while(num>=1){
num/=10;
i++;
}
printf("%d",i);
}
/* 题目2
水仙花(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A平方+B平方+C平方,则称其为水仙花数。
*/
void daffodil();
void daffodil()
{
int a,b,c;
for(a = 1; a<=9; a++){
for (b=0; b<=9; b++) {
for (c = 0; c<=9; c++) {
int sum1 = a*100+b*10+c;
int sum2 = a*a*a+b*b*b+c*c*c;
//printf("%4d",sum1);
if(sum1 == sum2){
printf("%4d",sum1);
}
}
}
}
}
/* 题目3
韩信点兵(hanxin)
相传寒心才智过人,从不直接清点自己军队人数,只要让士兵先后以3人一排、五人一排、七人一排的变换对象,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c,表示没中队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告误解)。已经总人数不小于10,不超过100。
*/
void hanxin();
void hanxin()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int i=0;i<=100;i++){
if(i%3==a&&i%5==b&&i%7==c){
printf("%d",i);
return;
}
}
printf("No answer");
}
/* 题目4
倒三角形(triangle)
输入正整数n<=20,输出一个n层的倒三角形。
*****
***
*
*/
void triangle();
void triangle()
{
int n;
scanf("%d",&n);
for (int i=0; i<n; i++) {
for (int j=0; j<i; j++) {
printf(" ");
}
for (int k=0; k<2*(n-i)-1; k++) {
printf("*");
}
printf("\n");
}
}
/* 题目5
统计(stat)
输入一个正整数n,然后读取n个正整数a1,a2,...an,最后再读一个正整数m。统计a1,a2,...an中有多少个整数的值小于m.
提示重定向和fopen都可以使用。
*/
void mystat();
void mystat()
{
}
/* 题目6
调和级数(harmony)
输入正整数n,输出H(n)=1+1/2+1/3+1/4+...+1/n的值,保留3位小数。例如n=3时答案位1.833。
*/
void harmony();
void harmony()
{
int n;
scanf("%d",&n);
float sum=0;
while (n) {
sum += 1.0/n--;
}
printf("%.3f",sum);
}
/* 题目7
近似计算(approximation)
计算pi/4 = 1-1/3+1/5-1/7+...,知道最后一项小与10的-6次方。
*/
void approximation();
void approximation()
{
float checkNum = 0.000001;
int i=1,flag = 1;
float sum = 0.0f;
while (flag) {
float t = 1.0/(2*i-1);
if(i%2==0){
sum -= t;
}else{
sum += t;
}
if (t<checkNum) {
flag = 0;
}
i++;
}
printf("%f",sum);
}
/* 题目8
子序列的和(subsequence)
输入两个正整数n<m<10的6字方,输出1/n平方+1/(n+1)平方+。。。+1/m平方,保留5位小数。
例如n=2,m=4时答案是0.42361, n=65536, m=655360时答案位0.00001.
*/
void subsequence();
void subsequence()
{
int n,m;
float sum = 0.0;
scanf("%d%d",&n,&m);
for (int i=n; i<=m; i++) {
sum += 1.0/(i*i);
}
printf("%f",sum);
}
/* 题目9
分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。
*/
void decimal();
void decimal()
{
int a,b,c,result;
scanf("%d%d%d",&a,&b,&c);
double f = a/b;
int i = c;
while (i) {
f*=10;
i--;
}
result = f;
i = c;
while (i) {
f = result/10.0;
}
printf("%lf",f);
}
/* 题目10
排列(permutation)
用1,2,3,..9,组成3个三位数abc,def和ghi,每个数恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
*/
void permutation();
void result(int num, int * result_add, int * result_mul);
void result(int num, int * result_add, int * result_mul)
{
int i, j, k;
i = num / 100; //百位
j = num / 10 % 10; //十位
k = num % 10; //个位
*result_add += i + j + k; //分解出来的位数相加
*result_mul *= i * j * k; //相乘
}
void permutation()
{
int i, j, k;
int result_add, result_mul;
for(i = 123; i <=329; i++)
{
j = i * 2;
k = i * 3;
result_add = 0;
result_mul = 1;
result(i, &result_add, &result_mul);
result(j, &result_add, &result_mul);
result(k, &result_add, &result_mul);
if(result_add == 45 && result_mul == 362880)
printf("%d %d %d\n", i, j, k);
}
}
int main(int argc, const char * argv[])
{
// insert code here...
printf("Hello, World!\n");
// digit();
// daffodil();
// hanxin();
// triangle();
// approximation();
// subsequence();
permutation();
return 0;
}
算法入门2(c语言)
最新推荐文章于 2024-05-28 14:30:07 发布