c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
2012-04-21 10:11
453 查看
// 智力题测试.cpp : 定义控制台应用程序的入口点。
//
/*
c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
对于用户给定的重量给出方案 如:输入5输出9-3-1
*/
#include "stdafx.h"
#include <stdio.h>
const int weight[5] = {1, 3, 9, 27, 81};
const int weight_sum[5] = {1, 4, 13, 40, 121};
const char operator_char[2] = {'+', '-'};
int func(int num, int index, int *key)
{
int gap = 0;
if(num > weight[4])
{
printf("%d+", weight[4]);
num -= weight[4];
}
for(int i = 0; i < index; i++)
{
if(num <= weight[i])
{
index = i;
break;
}
}
gap = weight[index] - num;
/*
* 用了递归的方法
* grap > 前几个数的和 num就是前面一个数加 新的num
* <= 前几个数的和 num 就是weight[index] 减新的num
*
*/
if(gap > weight_sum[index -1])//+
{
index -= 1;
num = num - weight[index];
printf("%d%c", weight[index], operator_char[0+*key]);
}
if(gap <= weight_sum[index]) // -
{
num = weight[index] - num;
printf("%d%c", weight[index], operator_char[1-*key]);
*key = 1^*key;
/*
* 如果前面出现 - 後面的运算符 要变换如
* 5 = 9 - (3 + 1) => 5 = 9 - 3 - 1
* key 为控制运算变换的控制变量
*/
}
if(num == 0) return 0;
return func(num, index, key);
}
void main()
{
int pressKey;
int num, key, index;
while(1)
{
key = 0;
index = 5;
scanf("%d", &num);
num = num > 121?121:num;
num = num < 1?1:num;
printf("%d = ", num);
func(num, index, &key);
printf("\b \n");
}
}
//
/*
c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
对于用户给定的重量给出方案 如:输入5输出9-3-1
*/
#include "stdafx.h"
#include <stdio.h>
const int weight[5] = {1, 3, 9, 27, 81};
const int weight_sum[5] = {1, 4, 13, 40, 121};
const char operator_char[2] = {'+', '-'};
int func(int num, int index, int *key)
{
int gap = 0;
if(num > weight[4])
{
printf("%d+", weight[4]);
num -= weight[4];
}
for(int i = 0; i < index; i++)
{
if(num <= weight[i])
{
index = i;
break;
}
}
gap = weight[index] - num;
/*
* 用了递归的方法
* grap > 前几个数的和 num就是前面一个数加 新的num
* <= 前几个数的和 num 就是weight[index] 减新的num
*
*/
if(gap > weight_sum[index -1])//+
{
index -= 1;
num = num - weight[index];
printf("%d%c", weight[index], operator_char[0+*key]);
}
if(gap <= weight_sum[index]) // -
{
num = weight[index] - num;
printf("%d%c", weight[index], operator_char[1-*key]);
*key = 1^*key;
/*
* 如果前面出现 - 後面的运算符 要变换如
* 5 = 9 - (3 + 1) => 5 = 9 - 3 - 1
* key 为控制运算变换的控制变量
*/
}
if(num == 0) return 0;
return func(num, index, key);
}
void main()
{
int pressKey;
int num, key, index;
while(1)
{
key = 0;
index = 5;
scanf("%d", &num);
num = num > 121?121:num;
num = num < 1?1:num;
printf("%d = ", num);
func(num, index, &key);
printf("\b \n");
}
}
相关文章推荐
- c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- JAVA 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- 用c语言编写输出四个整数,这四个整数可以表示1到40之间的任意一个数字。
- C语言编程练习——查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数:
- 五个整数任意组合(加减)得到1~122之间的数
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 编程实现任意长度整数的加法(整数可以长度超出C++中int范围)
- 五个整数任意组合(加减)得到1~122之间的数
- Linux下的C语言编程——查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方。以下程序验证[2,20]之间的数满足这一性质。
- 尾单词长度、1 3 9 27 81 实现1-121任意算法、去除重复字符并排序、拼音转数字、按要求分解字符串
- 编程实现将任意的十进制整数转换成任意R进制数(R在2-16之间)
- 有两个序列a,b,大小都为 n,序列元素的值任意整数,无序 通过交换a,b中的元素,使序列 a的和与序列b的和之间的差最小
- 随机生成一个1~100之间的整数,玩家可以通过函数InputBox命令输入数字来猜测那未知的随机数字