NYOJ 330

这道题一开始的想法是模拟除法,记录商和余数,然后判断余数即可(当余数为0/余数开始重复出现时,结束)

代码如下:

 1
 2 #include <stdio.h>
 3 #include <cmath>
 4 #include <string.h>
 5 #include <cstring>
 6 #include <iostream>
 7 #include <cmath>
 8 #include <cstdlib>
 9 using namespace std;
10 //测试1063
11 bool test(int data[],int num,int bar,int yu[],int yushu){
12     int time = 0;
13     for(int i=0;i<num;i++){
14         if(data[i]==bar&&bar!=0&&yu[i]==yushu) time++;
15         if(time==2) return 0;
16     }
17     return 1;
18 }
19
20 int main(){
21     int t;
22     cin>>t;
23     while(t--){
24         int n;
25         cin>>n;
26         if(n<0){
27             cout<<"-";
28             n = -1*n;
29         }
30
31         if(n==1){
32             cout<<"1\n";
33             continue;
34         }
35         else{
36             int data[100010],yu[100010];
37             int num=0,shang = 10,chushu = 10,sign = 0,yushu = 10;
38             while(test(data,num,shang,yu,yushu)){
39                 shang = chushu/n;
40                 data[num] = shang;
41                 yushu = chushu%n;
42                 yu[num] =yushu;
43                 num++;
44
45                 chushu = yushu *10;
46                 if(yushu==0){
47                     sign = 1;
48                     break;
49                 }
50             }
51
52             if(sign==1) num+=1;
53             cout<<"0.";
54             for(int i=0;i<num-1;i++){
55                 cout<<data[i];
56             }
57             cout<<endl;
58
59         }
60
61     }
62     return 0;
63 }
64         

这里写法最大的问题是在记录余数时,采取了顺序记录的策略。这样就要求,在比较时需要遍历一遍余数数组,假如输出商有n位,那么时间复杂度为O(n2).  结果超时了。

考虑到可用空间换时间,可优化“余数查重”的代价。(类比于计数排序中的用空间换时间的策略,设立一个余数的vis[]数组,由于余数<n,而n<=100000,故只需要开一个大小为100010的数组,如果vis[yushu]=1,就说明该余数已经取过(初始化余数数组都为0);),如此,时间复杂度变更为O(n).

代码如下:

 1 #include <stdio.h>
 2 #include <cmath>
 3 #include <string.h>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <cstdlib>
 8 using namespace std;
 9 //测试1063
10
11 int main(){
12     int t;
13     cin>>t;
14     while(t--){
15         int n;
16         cin>>n;
17         if(n<0){
18             cout<<"-";
19             n = -1*n;
20         }
21
22         if(n==1){
23             cout<<"1\n";
24             continue;
25         }
26         else{
27             int data[100010],yu[100010]={0};
28             int num=0,chushu = 1,yushu = 1;
29             yu[yushu] = 1;
30             while(1){
31                 chushu = yushu *10;
32                 data[num++] = chushu/n;  //把商记录起来
33                 yushu = chushu%n;         //计算余数
34
35                 if(yushu==0||yu[yushu] ) break; //如果余数为0或者出现过,则说明整除或够一个循环节
36                 yu[yushu] =1;               //比起上一个写法高效的地方,用空间换时间
37             }
38
39             cout<<"0.";
40             for(int i=0;i<num;i++){
41                 cout<<data[i];
42             }
43             cout<<endl;
44
45         }
46
47     }
48     return 0;
49 }
时间: 2024-08-11 07:44:31

NYOJ 330的相关文章

NYOJ 330 一个简单的数学题

一个简单的数学题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 zyc最近迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能编程帮助他. 输入 第一行整数T,表示测试组数.后面T行,每行一个整数 n (1<=|n|<=10^5). 输出 输出1/n. (是循环小数的,只输出第一个循环节). 样例输入 4 2 3 7 168 样例输出 0.5 0.3 0.142857 0.005952380 直接模拟求余数的方法,用一个数组

一个就简单的数学题 NYOJ 330

1 #include<stdio.h>//一个就简单的数学题(330) 2 #include<string.h> 3 int a[100010]; 4 int main() 5 { 6 int x,m,yu; 7 scanf("%d",&x); 8 while(x--){ 9 scanf("%d",&m); 10 memset(a,0,sizeof(a)); 11 yu=1; 12 if(m>0)printf("

NYOJ 330 一个简单的数学题【数学题】

/* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:如何处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法还没完全理解,先记着 */ 一个简单的数学题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 zyc最近迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能编程帮助他. 输入 第一行整数T,表示测试组数.后面T行,每行一个整数 n

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

NYOJ 289 苹果

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

人生的诗&middot;330~334节

330.    梦之国 在我的心里 有一个名为梦之国的国度 那是生命的桃源与归宿 伴随我在飞逝的流光中磨砺蹉跎 虚耗尽青春的飞扬 但一切终会开花,也终会结果 到那时 我将走入命定的结局 走入我的梦之国 331.    没有尽头 很多事 有了发端,却没有尽头 如同走一段没有终点的远程 仓皇地不断找寻黑白分明的终点 却再也看不到路途上的姹紫嫣红 我与你的交往是否也是这样 只是世俗地探求你于我的意义 却从不曾想过 你我的相遇本是生命的奇迹 回首间的相逢一笑 才是旅途中最大的幸福 332.    雨夜的